C++ 迪克斯特拉';s算法返回不正确的值

C++ 迪克斯特拉';s算法返回不正确的值,c++,algorithm,grid,dijkstra,path-finding,C++,Algorithm,Grid,Dijkstra,Path Finding,我在试图理解Dijkstra的算法时遇到了麻烦。简而言之,该算法在给定A和B之间的距离的情况下,找到A和B之间的最短距离 我将发布我的算法版本(到目前为止,我还没有在网上找到多少成功),然后是节点之间的距离 void GraphM::findShortestPath() { for (int i = 1; i <= nodeCount; i++) // From Node i... { for (int v = 1; v <= nodeCount

我在试图理解Dijkstra的算法时遇到了麻烦。简而言之,该算法在给定A和B之间的距离的情况下,找到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; 
}
…其中,在每行中,第一个令牌是第一个节点,第二个令牌是第二个节点,第三个令牌是这些节点之间的距离(在算法的情况下,这些令牌将是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,它等价于无穷大

还有,对于任何想知道的人;是的,这是一个家庭作业。不幸的是,我的教授需要一些具体的细节(比如使用struct),她除了有点模糊的大纲外,从来没有详细讨论过如何将Dijkstra的算法编写成代码。我只是问,如果可能的话,是否有人能告诉我我做错了什么,以及如何纠正


非常感谢您的任何帮助,这将为我节省大量时间,避免我的头撞到墙上

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

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

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; 
}
void GraphM::findShortestPath()
{  
//在此处将T[i][j]初始化为C[i][j]或MAX_INT

对于(int k=1;k你的算法是从哪里得到的'8?你所有的边都有5倍的权重…是的,这也让我很困惑。|我还看了维基百科的算法条目,奥利。我看了很多关于该算法的在线描述。我没有看到任何遵循二维数组结构的,这很不幸。Wh在你正在做的事情中,所有对最短路径的DP算法看起来更像。但是你的
访问的
数组在该上下文中没有用处,而且是错误的。此外,你混合了外部两个循环,它们应该是相反的。Dijkstra比从单个源中查找最短路径树更有效,但它是有效的仅当没有负边时为ksweights@user2844013:“我没有看到任何遵循二维数组结构的。我没有看到问题。维基百科伪代码中的(
dist_,v)
对应于你的
C[u][v]
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; 
}