Dijkstra算法实现中的错误

时间:2015-10-19 03:50:37

标签: c++ algorithm graph dijkstra

我正在尝试使用邻接列表尝试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";

我正在通过琐碎的测试用例。

示例输入:(x y w), 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

但是,我没有通过更复杂的测试用例。

1 个答案:

答案 0 :(得分:0)

似乎你混淆了两个阵列 - 一个已经访问过顶点的阵列,另一个用于最佳特殊距离(即到目前为止找到的顶点的最佳距离)。我们用v表示访问过的数组,用dist表示最佳距离数组。

在此声明中:

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

您需要使用dist代替v

弹出节点后,您需要检查是否已访问该节点。如果已访问,请继续执行下一个节点。否则将其标记为已访问并执行剩余的逻辑。

相关问题