using System;

namespace Indexs
{
    class program
    {
        static void Main(string[] args)
        {
            
            while(true)
            {
                Console.Clear();
                Console.WriteLine("Дана таблица работ для сетевого графика. Построить сетевой график и найти критический путь.");
            
                int[] ri = new int[] { 1, 1, 1, 2, 2, 3, 4 }; // начало пути 
                int[] rj = new int[] { 2, 3, 5, 3, 4, 4, 5 }; // конец пути 
                int[] dij = new int[ri.Length]; // объявление масива 

            m1: int otv = 0;
                while (true)
                {
                    Console.Write($"Введите номер способа заполнения продолжительностей работ\n1.Вручную\n2.Рандомно\nОтвет: ");
                    try
                    {
                        otv = int.Parse(Console.ReadLine());
                        break;
                    }
                    catch
                    {
                        Console.WriteLine("Введено некорректное значение! Повторите ввод");
                    }

                }

                switch (otv) // выбор ручного или автоматического заполнения 
                {
                    case 1:
                        int a = 0;
                        for (int i = 0; i < dij.Length; i++)
                        {
                            while (true) // проверка введенного значения 
                            {
                                Console.Write($"Ввдеите продолжительность {i + 1} работы: "); // ввод продолжительности работ 
                                a = Convert.ToInt32(Console.ReadLine());
                                if (a > 0)
                                {
                                    dij[i] = a;
                                    break;
                                }
                                else
                                {
                                    Console.WriteLine($"Введено некорректное значение! Повторите ввод.");
                                }
                            }
                        }
                        break;
                    case 2:
                        Random rnd = new Random();
                        for (int i = 0; i < dij.Length; i++) // рандомное заполнение 
                        {
                            dij[i] = rnd.Next(1, 100);
                        }
                        break;
                    default:
                        Console.WriteLine($"Введено некорректное значение! Повторите ввод.");
                        goto m1;
                        break;
                }

                Console.Clear();

                Console.WriteLine($"Работы и их продолжительность:");
                for (int i = 0; i < dij.Length; i++)
                {
                    Console.WriteLine($"{ri[i]}-{rj[i]}({dij[i]})");  // вывод таблицы 
                }

                Console.WriteLine();

                int[,] table = new int[4, 5];

                int[][] pathes = new int[4][]; // массив из массивов (ступенчатый массив)
                pathes[0] = new int[5];
                pathes[1] = new int[6]; // пути , одна ячейка для F
                pathes[2] = new int[5];
                pathes[3] = new int[3];

                for (int i = 0; i < ri.Length; i++)
                {
                    table[ri[i] - 1, rj[i] - 1] = dij[i];  // заполнение таблицы с продолжительностями в днях 
                }

                pathes[0][0] = 1;
                pathes[0][1] = 2; // пути заполняются 
                pathes[0][2] = 4;
                pathes[0][3] = 5;

                pathes[1][0] = 1;
                pathes[1][1] = 2;
                pathes[1][2] = 3;
                pathes[1][3] = 4;
                pathes[1][4] = 5;

                pathes[2][0] = 1;
                pathes[2][1] = 3;
                pathes[2][2] = 4;
                pathes[2][3] = 5;

                pathes[3][0] = 1;
                pathes[3][1] = 5;

                for (int j = 0; j < pathes.Length; j++) // перебирает массивы внутри массива
                {
                    for (int i = 1; i < pathes[j].Length - 1; i++) // перебирает элементы конкретного массива 
                    {
                        pathes[j][pathes[j].Length - 1] += table[pathes[j][i - 1] - 1, pathes[j][i] - 1]; // обращаемся к последнему элементу массива и плюсуем значение пути
                    }
                }

                for (int j = 0; j < pathes.Length; j++)// перебират массивы внутри массива 
                {
                    Console.Write($"Путь {j + 1}: "); // выводит путь индекс пути 
                    for (int i = 0; i < pathes[j].Length - 1; i++) // последняя f его не выводим 
                    {
                        if (i == pathes[j].Length - 2)
                        {
                            Console.Write($"{pathes[j][i]}");
                        }
                        else
                        {
                            Console.Write($"{pathes[j][i]}-");
                        }

                    }
                    Console.WriteLine($"; F = {pathes[j][pathes[j].Length - 1]}"); // вывод f
                }

                int MaxF = int.MinValue; /// для поиска максимального f
                int ind = 0; // индекс максимального пути 

                for (int i = 0; i < pathes.Length; i++)
                {
                    if (MaxF < pathes[i][pathes[i].Length - 1])
                    {
                        MaxF = pathes[i][pathes[i].Length - 1];
                        ind = i;
                    }
                }

                Console.Write($"Критический путь - Путь {ind + 1}: ");//вывод критического пути и его индекс 
                for (int i = 0; i < pathes[ind].Length - 1; i++)
                {
                    if (i == pathes[ind].Length - 2)
                    {
                        Console.Write($"{pathes[ind][i]}");
                    }
                    else
                    {
                        Console.Write($"{pathes[ind][i]}-");
                    }

                }
                Console.WriteLine($"; F = {pathes[ind][pathes[ind].Length - 1]}");
                while (true)
                {
                    Console.Write($"Хотите повторить выполнение программы ? (0 - нет, любая цифра - да)");
                    try
                    {
                        otv = int.Parse(Console.ReadLine());
                        break;
                    }
                    catch
                    {
                        Console.WriteLine("Введено некорректное значение! Повторите ввод");
                    }

                }
                if (otv == 0)
                {
                    break;
                }
            }
        }
        
    }
}