根据算法书 Corman ,Dijkstra仅适用于所有边都具有非负权重的图。 这是否意味着,如果有任何具有负权重的边缘,它将不适用于整个图形? 要么 它不会算到负重量边缘吗? 请说明哪一个是对的?
答案 0 :(得分:7)
Dijkstra算法有时可以处理某些负边缘的图形,例如:
A-->B-->C
w(A, B) = -1
和w(B, C) = -2
。
但是当至少存在一个负边缘时,它无法证明总是正确的。喜欢:
A-->B-->C-->D
\ /
\ _____ /
其中w(A, B) = 1
,w(B, C) = 3
,w(C, D) = -5
,w(A, D) = 2
。
如果您选择A作为源点,您将通过Dijkstra算法获得从A到D的最短路径长度为2
,而实际上不是-1
。
这是因为Dijkstra算法是一种贪婪算法,其正确性证明程序使用它的所有边缘都是非负的以获得矛盾。 关于它的证明程序,你可以在定理24.6(Dijkstra算法的正确性),算法导论中查阅。
答案 1 :(得分:0)
负边的主要问题是负循环。如果图形包含顶点S和顶点T之间的负循环,则S和T之间没有最短路径.Dijkstra找到最短路径,这是不正确的。
因此,负边缘不仅被忽略,而且会导致完全错误的解决方案。
另一种选择是Bellman-Ford算法,它在| V | -th迭代中找到那些负循环。