关于dijkstra算法的困惑?

时间:2013-08-09 15:06:00

标签: algorithm graph dijkstra shortest-path

根据算法书 Corman ,Dijkstra仅适用于所有边都具有非负权重的图。 这是否意味着,如果有任何具有负权重的边缘,它将不适用于整个图形? 要么 它不会算到负重量边缘吗? 请说明哪一个是对的?

2 个答案:

答案 0 :(得分:7)

Dijkstra算法有时可以处理某些负边缘的图形,例如:

A-->B-->C

w(A, B) = -1w(B, C) = -2

但是当至少存在一个负边缘时,它无法证明总是正确的。喜欢:

A-->B-->C-->D
 \         /
  \ _____ /

其中w(A, B) = 1w(B, C) = 3w(C, D) = -5w(A, D) = 2

如果您选择A作为源点,您将通过Dijkstra算法获得从A到D的最短路径长度为2,而实际上不是-1

这是因为Dijkstra算法是一种贪婪算法,其正确性证明程序使用它的所有边缘都是非负的以获得矛盾。 关于它的证明程序,你可以在定理24.6(Dijkstra算法的正确性),算法导论中查阅。

答案 1 :(得分:0)

负边的主要问题是负循环。如果图形包含顶点S和顶点T之间的负循环,则S和T之间没有最短路径.Dijkstra找到最短路径,这是不正确的。

因此,负边缘不仅被忽略,而且会导致完全错误的解决方案。

另一种选择是Bellman-Ford算法,它在| V | -th迭代中找到那些负循环。