具有负边的有向无环图的Dijkstra算法

时间:2015-03-11 20:37:00

标签: algorithm dijkstra directed-acyclic-graphs

如果Dijkstra算法是非循环的(DAG),那么Dijkstra算法会在带有负边的图上工作吗?我认为这是因为没有循环就不会有负循环。这个算法失败还有其他原因吗?

谢谢[明天中期]

3 个答案:

答案 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的纯粹实施就会失败。以下变体仍适用于给定的问题场景。

  1. 每次边缘u - > v放松,将一对(从源更新/更短的距离)推入队列。这会导致队列中相同顶点的多个副本与源距离不同。
  2. 继续更新距离,直到队列为空。
  3. 即使存在负边缘,上述变体仍然有效。但是如果有负重量循环则不然。 DAG是非循环的,所以我们不必担心负循环。

    使用拓扑排序可以更有效地计算DAG的最短路径距离O(V + E)时间。可以找到更多详细信息here