为什么我们不能将Dijkstra算法应用于具有负权重的图形?

时间:2010-07-08 03:09:10

标签: dijkstra

为什么我们不能将Dijkstra算法应用于负权重图?

3 个答案:

答案 0 :(得分:15)

从A到B找到最便宜的路径是什么意思,如果你每次从C到D旅行都会得到付费

如果两个节点之间存在负权重,则“最短路径”将永远在这两个节点之间循环向前和向后循环。跳越多,路径“越短”。

这与算法无关,而且与回答这样一个问题的不可能性有关。

修改

上述声明采用双向链接。如果没有总体负重的周期,你就没有办法永远地循环,获得报酬。

在这种情况下,Dijkstra的算法可能仍会失败:

考虑两条路径:

  • 在穿越最终边缘之前成本为100的最佳路径,该最终边缘具有-25重量,总计为75,并且
  • 次优路径,没有负加权边,总费用为90.

Dijkstra的算法将首先研究次优路径,并在找到它时声明自己完成。它永远不会跟踪比第一个找到的解决方案更差的子路径

答案 1 :(得分:4)

我会给你一个反例。请考虑以下图表

http://img853.imageshack.us/img853/7318/3fk8.png

假设您从顶点A开始,并且想要到D的最短路径。 Dijkstra的算法将执行以下步骤:

  1. A标记为已访问,并将顶点BC添加到队列
  2. 以最小距离从队列顶点获取。它是B
  3. B标记为已访问,并将顶点D添加到队列。
  4. 从队列中获取。不是它是顶点D
  5. D标记为已访问
  6. Dijkstra说从AD的最短路径长度为2,但显然不是这样。

答案 2 :(得分:2)

想象一下,你有一个带有定向循环的有向图,其周围的总“距离”是一个负重量。如果在从开始到结束顶点的路上你可以通过该定向循环,你可以简单地绕过定向循环任意次数。

这意味着你可以让你在图表中的路径具有无限的负距离(或者实际上是这样)。

但是,只要你的图表周围没有定向循环,你就可以使用Dijkstra算法而不会爆炸。

所有这一切,如果你有一个负权重的图表,你可以使用Belman-Ford算法。然而,由于该算法的普遍性,它有点慢。 Bellman-Ford算法需要O(V·E),其中Dijkstra需要O(E + VlogV)时间