Dijkstra负权重算法

时间:2015-05-04 09:27:22

标签: algorithm dijkstra

现在我知道如果图形包含负权重边缘,Dijkstra将无法工作。但是有一个例外。 (只有离开源的边可以具有负权重,而所有其他边必须为正。)

我希望能够证明这一点。我不知道如何开始这个。我已经制作了一些图表,所有那些Dijkstra最终完成了工作,但我不明白如何证明这一点?

所以我真正想要的是有人证明Dijkstra会在这种情况下工作或不会(只有来自源的传出边缘是负面的。)

此外,图表不能包含任何涉及来源的周期。

2 个答案:

答案 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作为证明,但这不是自包含的。