使用Dijkstra算法找到最短路径

Sir*_*gio 11 c# dijkstra

我需要找到图形的2个顶点之间的最短路径.我有一个矩阵,其中包含所有权重.我该怎么做?目前,我有以下代码:

private int[] Dijkstra(int start, int end)
    {
        bool[] done = new bool[8];
        int[] parent = new int[8];
        for (int i = 0; i < parent.Length; i++)
            parent[i] = -1;
        int[] distances = new int[8];
        for (int i = 0; i < distances.Length; i++)
            distances[i] = int.MaxValue;
        distances[start] = 0;
        int current = start;
        while (!done[current])
        {
            done[current] = true;
            for (int i = 0; i < 8; i++)
            {
                if (graph[current, i] != int.MaxValue)
                {
                    int dist = graph[current, i] + distances[current];
                    if (dist < distances[i])
                    {
                        distances[i] = dist;
                        parent[i] = current;
                    }
                }
            }
            int min = int.MaxValue;
            for (int i = 0; i < 8; i++)
            {
                if (distances[i] < min&&!done[i])
                {
                    current = i;
                    min = distances[i];
                }
            }
        }
        return parent;
    }
Run Code Online (Sandbox Code Playgroud)

它有效,但是,我不知道如何让它找到例如1和3之间的最短路径,并返回路线,如1 => 4 => 2 => 3.
提前致谢.

Tra*_*vis 7

Djikstra的算法使用父数组来跟踪从开始到结束的最短路径.你从父[end]开始并按照数组的条目,直到你回来开始.

一些伪代码:

List<int> shortestPath = new List<int>();
int current = end;
while( current != start ) {
     shortestPath.Add( current );
     current = parent[current];
}

shortestPath.Reverse();
Run Code Online (Sandbox Code Playgroud)

您唯一担心的是您的函数需要担心的是传入的起始值和结束值是否是合适的值(例如,它们是否实际表示图中的顶点).