簡體   English   中英

Dijkstra算法實現中的錯誤

[英]Error in Implementation of Dijkstra's Algorithm

我試圖用鄰接表來嘗試Dijkstra,我不知道為什么我的測試用例不及格。

Node * n = list[source].head;
while(n)
{
    q.push(n);
    v[n->b] = n->w;
    n = n->next;
}

while(!q.empty())
{
    n = q.front();
    i = n->b;
    o = list[i].head;
    q.pop();

    while(o)
    {
        if(!v[o->b]) 
        {
            q.push(o);
            v[o->b] = v[i] + o->w;
        } 
        else if(v[o->b] > v[i] + o->w)
        {
            v[o->b] = v[i] + o->w;   
        }
        o = o->next;
    }
}

i = 0;
while(i < vertices)
{
    if(i != node)
        printf("%d ", v[i] ? v[i] : -1);
    i++;
}
cout<<"\n";

我正在通過瑣碎的測試用例。

輸入示例:(xyw),1 2 3,1 3 4,1 4 5,3 5 101,

來源為1。

輸出:3 4 5 5

示例2:1 2 24 1 4 20 3 1 3 4 3 12

來源為1。

輸出:24 3 15

但是,我無法通過更復雜的測試用例。

似乎您在混淆這兩個數組-一個數組已經訪問了頂點,另一個數組用於最佳的特殊距離(即到目前為止找到的頂點的最佳距離)。 讓我們用v表示訪問數組,用dist表示最佳距離數組。

在此語句中:

if(v[o->b] > v[i] + o->w)

您需要使用dist而不是v

彈出節點后,您需要檢查是否已訪問它。 如果已訪問,請繼續到下一個節點。 否則,將其標記為已訪問並執行其余邏輯。

暫無
暫無

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

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