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; } } } } }