Dijkstra的算法返回不正确的值

时间:2014-04-26 19:48:50

标签: c++ algorithm grid dijkstra path-finding

我试图了解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算法编写到代码中,除了有点模糊的轮廓。我只是在问,如果有可能,有人可以告诉我我做错了什么以及如何解决它。

非常感谢任何帮助,并且可以节省我很多时间从头撞墙。

1 个答案:

答案 0 :(得分:1)

这不是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; 
}