[英]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.