예제 #1
0
        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();
        }
예제 #2
0
        /// <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("Граф не связный");
            }
        }