现在我知道如果图形包含负权重边缘,Dijkstra将无法工作。但是有一个例外。 (只有离开源的边可以具有负权重,而所有其他边必须为正。)
我希望能够证明这一点。我不知道如何开始这个。我已经制作了一些图表,所有那些Dijkstra最终完成了工作,但我不明白如何证明这一点?
所以我真正想要的是有人证明Dijkstra会在这种情况下工作或不会(只有来自源的传出边缘是负面的。)
此外,图表不能包含任何涉及来源的周期。
答案 0 :(得分:2)
首先请注意,如果没有涉及源的循环,我们可以修剪输入到源的任何边的图,并且它不会影响结果,在Dijkstra中不会到达导致源的顶点&# 39; s算法无论如何(因为否则,有一个涉及源的循环)。
从现在开始,我们假设源没有传入边缘。
请注意,放松步骤(三角形不等式)所需的声明:#ifndef CONFIG_H
#define CONFIG_H
#define PROJECT "SampleName"
#define PROJECT_VERSION "0.0.0"
#define PROJECT_VERSION_MAJOR "0"
#define PROJECT_VERSION_MINOR "0"
#define PROJECT_VERSION_PATCH "0"
#endif
必须为每个d(u,v) <= d(u,x) + w(x,v)
保持(空白),w(x,v) < 0
唯一存在{{1}的路径u
} u
(源代码)是x
,路径是空路径。
这导致我们u=x=source
(其中d(u,x) + w(x,v) = 0 + w(x,v) = w(u,v) = d(u,v)
是来源),不平等仍然存在。
答案 1 :(得分:0)
您可以简单地将一般初始实例D转换为可行实例D'(即,仅包含正边值的实例),然后显示Dijkstra算法在两个实例上的行为相同。由此可以得出结论,Dijkstra的算法在D形式的实例上是正确的。
以下是详细信息:
通过插入一个只有一条边的“超级源”s将一个D转换为D' - 一个输出到s的距离为d(s',s)= -min {d(s,x) | x是节点}。这个实例相当于将d(s',s)添加到s的所有传出边的实例,我们称之为D';它只有正边权。
Dijkstra算法在D和D'上的行为与队列中距离的排序保持不变相同,因此相同的节点以相同(移位)距离等结算。请注意,在此参数中我们隐含地使用没有(负)循环包含s。
因为我们知道Dijkstra在D'上的算法找到了转换图的正确距离,并且D和D'的最短路径的结构必须相同,我们可以得出结论Dijkstra的算法在D形式的实例上是正确的。
注意:您总是可以使用所谓的Johnson Shift让Dijkstra算法在没有负循环的图形上正确执行。您也可以使用Johnson Shift作为证明,但这不是自包含的。