我可以将Dijkstra算法用于负加权图吗?

时间:2013-05-12 12:16:41

标签: algorithm graph-theory dijkstra

我知道Bellman Ford算法适用于负加权Graph,但我开发了一个Dijkstra算法的代码,效果非常好。但是当我插入负加权边时它失败了。任何解决方案?

4 个答案:

答案 0 :(得分:2)

我认为我们不能这样做,因为Dijkstra算法找不到到达目标顶点的最终方法,因为它可能卡在循环中,它不是用于负加权图,你应该选择Bellman ford算法

答案 1 :(得分:2)

实际上,在特殊情况下可能。如果存在负长度的边缘,Dijkstra algorithm将失败。但是,如果所有边都是负长度,则可以反转所有边的长度,并使用算法查找图的两个顶点之间的最长路径(路径将表示原始图中的最短路径)。

但是在一般情况下,如你所说,不可能使用Dijkstra。如果没有负长度循环,则应使用Bellman-Ford算法。如果你不能保证没有负长度的循环,那么问题是 NP-complete 并且没有已知的多项式算法。

答案 2 :(得分:1)

正如您所说,Bellman Ford是在负权重图中找到最短路径的首选算法。在这种情况下使用Dijkstra算法的问题是Dijkstra假设图中从s到t的所有可能的子路径都必须小于目标子路径,这在添加负边权重时不一定正确。

答案 3 :(得分:1)

如果所有边权重均为正,则可确保向路径添加更多边缘使其更长。知道了这一点,Dijkstra的算法将丢弃任何长度超过它发现到某个顶点的路径,因为长路径不可能比短路径短。

然而,如果存在负边缘权重,则该假设不成立,因为我们可能有一条我们丢弃的极长路径P,但是在某个地方,P可以通过非常负的边缘并且变得比最短路径短你现在有。因此,我们不能保证我们发现的路径在Dijkstra算法的任何阶段都是最短的,算法依赖于该算法。