如果Dijkstra算法是非循环的(DAG),那么Dijkstra算法会在带有负边的图上工作吗?我认为这是因为没有循环就不会有负循环。这个算法失败还有其他原因吗?
谢谢[明天中期]
答案 0 :(得分:10)
考虑图表(定向1 -> 2, 2-> 4, 4 -> 3, 1 -> 3, 3 -> 5
):
1---(2)---3--(2)--5
| |
(3) (2)
| |
2--(-10)--4
最小路径为1 - 2 - 4 - 3 - 5
,费用为-3
。但是,Dijkstra将在第一步中设置d[3] = 2, d[2] = 3
,然后从其优先级队列中提取节点3
并设置d[5] = 4
。由于节点3是从优先级队列中提取的,并且Dijkstra不会将给定节点多次推送到其优先级队列,因此它将永远不会再次进入其中,因此该算法无法正常工作。
Dijkstra的算法不适用于负边缘,周期。没有一个周期没有改变。 Bellman-Ford是能够检测负成本周期并与负边缘一起工作的人。如果你有负边缘,Dijkstra将无法工作。
如果您更改Dijkstra的算法,使其可以多次将节点推送到优先级队列,那么算法将使用负成本边缘。但是,如果新算法仍然是Dijkstra,那么这是有争议的:我会说你得到Bellman-Ford的方式,这通常就是这样实现的(好吧,通常使用FIFO队列而不是优先级队列)。
答案 1 :(得分:0)
我认为如果没有负重,Dijkstra的算法将适用于DAG。因为Dijkstra的算法无法给出负加权边缘图的正确答案。但有时它确实基于图表类型。
答案 2 :(得分:0)
只要存在负边缘权重,Dijkstra的纯粹实施就会失败。以下变体仍适用于给定的问题场景。
即使存在负边缘,上述变体仍然有效。但是如果有负重量循环则不然。 DAG是非循环的,所以我们不必担心负循环。
使用拓扑排序可以更有效地计算DAG的最短路径距离O(V + E)时间。可以找到更多详细信息here