簡體   English   中英

Dijkstra的算法返回錯誤值

[英]Dijkstra's algorithm returning incorrect values

在嘗試理解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,它等效於無窮大。

另外,對於任何想知道的人; 是的,這是一項家庭作業。 不幸的是,我的教授需要一些特定的細節(例如使用struct 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; 
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM