如果有向图只有一个负权重边并且不包含负权重周期,Dijkstra的算法会起作用吗?
答案 0 :(得分:15)
没有。 Dijkstra的算法很贪婪。它假定路径权重严格增加。
请考虑以下图表。 S→A→E是最佳的,但Dijkstra将返回S→B→E。
答案 1 :(得分:2)
不一定。在this earlier answer中,我举了一个没有负周期和一个负边的图的例子,其中Dijkstra的算法没有产生正确的答案。因此,在这种情况下,Dijkstra的算法并不总是有效。
希望这有帮助!
答案 2 :(得分:2)
没有。 Dijkstra是贪心算法。一旦它添加了边缘,它就永远不会回头。
答案 3 :(得分:2)
没有。考虑以下简单的反例,只有3个节点,S
(开始),A
和B
。
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