static void Main(string[] args) { #region Считывание матрицы (смежности) из файла MatrixClass matrix = new MatrixClass(); matrix.InsertFromFile(@"D:\adj.txt"); matrix.ShowMatrix(); #endregion #region Проверка связности графа GraphClass.GraphClassInit(matrix); Console.WriteLine($"Граф связный? -> {GraphClass.IsConnectedGraph(matrix, 1)}\n"); #endregion #region Вывод кратчайших путей от заданной точки DijkstraAlgorithm.Init(matrix); DijkstraAlgorithm.Algorithm(matrix, 0); DijkstraAlgorithm.ShowMinDistances(); #endregion Console.ReadLine(); }
/// <summary> /// Инициализация класса начальными данными /// </summary> /// <param name="adjMatrix">Матрица смежности</param> public static void Init(MatrixClass adjMatrix) { minDist = new int[adjMatrix.Size]; vertexs = new int[adjMatrix.Size]; for (int i = 0; i < adjMatrix.Size; i++) { minDist[i] = Int32.MaxValue; vertexs[i] = 1; } }
/// <summary> /// Алгоритм Дейкстры /// </summary> /// <param name="adjMatrix">Матрица смежности</param> /// <param name="vertex">Вершина, для которой ищутся кратчайшие пути до других вершин</param> public static void Algorithm(MatrixClass adjMatrix, int vertex) { if (GraphClass.IsConnectedGraph(adjMatrix, vertex)) //<- если граф не связный, то выкидываем исключение, иначе продолжаем { if (vertex >= 0 & vertex < adjMatrix.Size) { minDist[vertex] = 0; //<- задаем у заданной вершины минимальный путь равный 0, т.к. мы уже в ней находимся } else { throw new ArgumentException(); } do { minIndex = 1000; min = 1000; for (int i = 0; i < adjMatrix.Size; i++) { if ((vertexs[i] == 1) && (minDist[i] < min)) { min = minDist[i]; minIndex = i; } } if (minIndex == 1000) { break; } if (minIndex != Int32.MaxValue) { for (int i = 0; i < adjMatrix.Size; i++) { if (adjMatrix.Matrix[minIndex * adjMatrix.Size + i] < 1000) { int temp = min + adjMatrix.Matrix[minIndex * adjMatrix.Size + i]; if (temp < minDist[i]) { minDist[i] = temp; } } } vertexs[minIndex] = 0; } } while (minIndex < 1000); } else { throw new Exception("Граф не связный"); } }