Dijkstra 算法返回不正确的值

Dijkstra's algorithm returning incorrect values

本文关键字:不正确 返回 算法 Dijkstra      更新时间:2023-10-16

我在试图理解Dijkstra的算法时遇到了困难。简而言之,该算法在给定A和B之间的距离的情况下,找到它们之间的最短距离。

我将发布我的算法版本(到目前为止,我在网上搜索还没有取得多大成功),然后是节点之间的距离。

void GraphM::findShortestPath()
{
    for (int i = 1; i <= nodeCount; i++)    // From Node i...
    {
        for (int v = 1; v <= nodeCount; v++) // ...through Node v...
        {
            for (int w = 1; w <= nodeCount; w++) // ...to Node w
            {
                if (!T[i][w].visited || !T[i][v].visited)
                {
                    T[i][w].dist = min(T[i][w].dist, T[i][v].dist + C[v][w]);
                    T[i][v].visited = true;
                    T[i][w].visited = true;
                }           
            }
        }
    }
    cout << "1 to 2 is " << T[1][2].dist << endl; 
}

这会输出以下内容:

1 to 2 is 48

什么时候应该是

1 to 2 is 40

我使用的值如下:

1 2 50
1 3 20
1 5 30
2 4 10
3 2 20
3 4 40
5 2 20
5 4 25

其中,在每一行中,第一个令牌是第一个节点,第二个令牌是第二个节点,而第三个令牌是这些节点之间的距离(在算法的情况下,这些令牌将是i、v和T[i][v].dist)。在算法中,nodeCount是网格中的节点数(5),w是我们正在寻找从i到的距离的节点。C[v][w]返回v和w之间的原始距离。因此,如果v是5,w是2,C[v][w]将返回20。这是常数,而T[v][w].dist(例如)可以更改。

任何不存在的节点关系,如C[5][3]或T[1][4].dist(至少在一开始)都返回INT_MAX,它等价于无穷大。

此外,对于任何想知道的人;是的,这是一项家庭作业。不幸的是,我的教授需要一些具体的细节(比如使用结构T),除了一个有点模糊的大纲外,她从未详细介绍过如何将Dijkstra的算法写入代码。我只是想问是否有人能告诉我我做错了什么,如果可能的话,如何解决。

我们非常感谢任何帮助,这将为我节省很多时间,使我不用把头撞到墙上。

这不是Dijkstra的算法。你试图实现的是Floyd-Warshall算法。这将找到所有顶点对的最小距离。

http://en.wikipedia.org/wiki/Floyd–Warshall_algorithm

请注意,第一个循环循环通过传输节点。使用此实现,您不需要记住您已经访问过的边缘。

void GraphM::findShortestPath()
{  
    // Initialize T[i][j] to C[i][j] or MAX_INT here
    for (int k = 1; k <= nodeCount; k++)    // Through Node k...
    {
        for (int u = 1; u <= nodeCount; u++) // ...From Node u...
        {
            for (int v = 1; v <= nodeCount; u++) // ...to Node v
            {
                // if going through k provides a cheaper path, update T[u][v]
                T[u][v] = min(T[u][v], T[u][k] + T[k][v]);           
            }
        }
    }
    cout << "1 to 2 is " << T[1][2]<< endl; 
}