Dijkstra的算法是否适用,即使只有一个负权重边缘?

时间:2013-11-21 19:45:14

标签: algorithm data-structures dijkstra

如果有向图只有一个负权重边并且不包含负权重周期,Dijkstra的算法会起作用吗?

9 个答案:

答案 0 :(得分:15)

没有。 Dijkstra的算法很贪婪。它假定路径权重严格增加。

请考虑以下图表。 S→A→E是最佳的,但Dijkstra将返回S→B→E。

troublesome graph

答案 1 :(得分:2)

不一定。在this earlier answer中,我举了一个没有负周期和一个负边的图的例子,其中Dijkstra的算法没有产生正确的答案。因此,在这种情况下,Dijkstra的算法并不总是有效。

希望这有帮助!

答案 2 :(得分:2)

没有。 Dijkstra是贪心算法。一旦它添加了边缘,它就永远不会回头。

答案 3 :(得分:2)

没有。考虑以下简单的反例,只有3个节点,S(开始),AB

w(S, A) = 1
w(S, B) = 2
w(B, A) = -2

该算法将首先确定A的距离(费用1),但通过B(费用0)去那里会更便宜。

答案 4 :(得分:2)

由于Dijkstra的算法是贪婪的,因此它不适用于负权重。为此需要一些其他算法,如Bellman-Ford算法。

但是,如果你仍想使用Dijkstra的算法,那就有一种已知的方法。在这种方法中,您需要重新分配成本,以便所有成本都变为正值。

这是:

假设从u到v都存在边缘。边缘的成本是成本(u,v)。

u(d(u))------>v(d(v))

定义:

new_cost(u,v) = cost(u,v) + d(u) - d(v)

这保证是正面的,

d(v) < d(u) + cost(u,v)

现在,我们可以正常应用Dijkstra算法,只有差别在新路径的成本中,这将是(比如路径在s'和t'之间)

= original cost of the same path + d(s') - d(t')

答案 5 :(得分:2)

您无法将Dijkstra算法直接应用于具有负边缘的图形,因为其他一些答案已正确记录。

如果原始图形中没有负循环,有一种方法可以重新称量图形边缘。这与Johnson's algorithm中使用的技术相同,首先运行Bellman-Ford算法的一个实例,以获得每个顶点h(v)的权重v。然后,您将每个边w(u,v)修改为w(u,v) + h(u) − h(v),保证为正,这样您最终得到一个只有正边的新图,您可以在其上运行Dijkstra算法。

第十五节。来自Coursera Algorithms class的解释比我好得多。

将该技术应用于单一来源最短路径问题的唯一问题是,使用Bellman-Ford重新加权需要O(mn)时间,这比Dijkstra的O(m log(n))要慢。所以你最好只运行Bellman-Ford作为原始图表。

答案 6 :(得分:2)

只要您从具有该负边缘的节点开始作为输出边缘,Dijkstra的算法将使用单个负边缘。
通过从图的最小值边开始,您不能再通过考虑其他边权重来降低总成本(这就是Dijkstra算法的工作原理)

答案 7 :(得分:1)

不,众所周知,Dijkstras算法无法使用负权重。 如果您需要负权重,请使用Bellman-Ford算法。

答案 8 :(得分:0)

为什么Dijkstra会失败呢

因为最短路径应该是:距离(s,vi)≤距离(s,vk)

例如,我们有这个图:

A ----&gt; B,成本为2 B ---&gt; C,成本为负4,条件为False,因为从A到B的距离>距离B到C