Dijkstra算法在有向图上具有负边

时间:2010-09-30 18:09:00

标签: algorithm theory

如果唯一的负边缘成本来自初始节点怎么办?该算法仍然有用吗?

我觉得是的,因为我无法想到反例,但我无法证明这一点。有反例吗?

对于Dijkstra来说,负边是一个问题,因为如果有一条边可以在以后选择,而在很大程度上是负加权,则不能保证你选择的边产生最短路径。但是如果唯一的负边缘从初始节点出来,我就没有看到问题。

我不是在寻找算法。我正在寻找对Dijkstra的一些见解。

我正在谈论有向图,如果这会产生影响。

3 个答案:

答案 0 :(得分:21)

具有负成本优势的问题在于,您可以随心所欲地来回走动。

如果您施加的规则不允许多次使用边缘,则仍然存在问题。 Dijkstra的算法涉及将节点标记为“已访问”,当它与初始节点的距离被认为是一劳永逸时。这发生在检查所有边缘之前;已找到从初始节点到节点X的最短路径,来自初始节点的所有其他路径已经比此更长,以后发现的任何路径都不能使这些路径更短。但是如果某处存在负成本边缘,那么后来的发现可以使路径变短,因此可能存在Dijkstra不会发现的较短路径。

如果只有连接到初始节点的边缘可能有负成本,那么你仍然有问题,因为最短路径可能涉及重新访问初始节点以利用负成本,这是Dijkstra无法做到的。

如果你强加另一个规则,可能不会多次访问某个节点,那么Dijkstra的算法就可以运行。请注意,在Dijkstra算法中,初始节点的初始距离为零。如果你给它一些其他的初始距离,算法仍然会找到最短的路径 - 但是所有的距离都会偏离相同的量。 (如果你想要最后的实际距离,你必须减去你输入的值。)

  1. 所以拿你的图表,称之为 A ,找到连接到初始节点的任何边缘的最小成本,称之为k,在这种情况下为负值)。
  2. 通过从连接到初始节点的每条边的成本中减去k得到一个新图 B 。请注意,所有这些成本现在都是非负的。所以Dijkstra在 B 上工作。另请注意, B 中的最短路径也是 A 中的最短路径。
  3. B 的初始节点分配距离k,然后运行Dijkstra(这将提供与初始距离为零的运行相同的路径)。将此与在 A 上天真地运行Dijkstra进行比较:一旦离开初始节点,两个图中的所有内容都相同。距离是相同的,决定是相同的,两者将产生相同的路径。并且在 A 的情况下,distace将是正确的,因为它从零开始。

答案 1 :(得分:12)

反示例:

图G =(V,E),顶点V = {A,B},边E = {(A,B),(B,A)}和权函数w(A,B)= -2 ,w(B,A)= +1。

负重周期为负,因此最小距离未定义(即使使用A作为初始节点)。

答案 2 :(得分:0)

Dijkstra算法不能为具有负边权重的图形生成正确答案(即使图形没有任何负权重周期)。对于例如它计算了(A,C)之间不正确的最短路径值,用于跟随源顶点A的图,

A -> B : 6
A -> C : 5
B -> D : 2
B -> E : 1
D -> E : -5
E -> C : -2