我正在尝试使用邻接列表尝试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
但是,我没有通过更复杂的测试用例。
答案 0 :(得分:0)
似乎你混淆了两个阵列 - 一个已经访问过顶点的阵列,另一个用于最佳特殊距离(即到目前为止找到的顶点的最佳距离)。我们用v
表示访问过的数组,用dist
表示最佳距离数组。
在此声明中:
if(v[o->b] > v[i] + o->w)
您需要使用dist
代替v
。
弹出节点后,您需要检查是否已访问该节点。如果已访问,请继续执行下一个节点。否则将其标记为已访问并执行剩余的逻辑。