【问题标题】:dijkstra's vs Bellman-Ford algorithm [duplicate]dijkstra vs Bellman-Ford算法[重复]
【发布时间】:2020-03-23 19:07:32
【问题描述】:
我目前的理解是,dijkstra 的算法比 bellman-ford 更有效,只是它不能处理负边缘。但是,如果我们有一个边加权图,其中有负权边,图中没有负权循环,我们还可以使用 dijkstra 算法吗?
【问题讨论】:
标签:
algorithm
graph
dijkstra
graph-traversal
bellman-ford
【解决方案1】:
这个问题已经在这里得到了很好的回答。
https://stackoverflow.com/a/13159425/12449779
总而言之,Dijkstra 的算法在每次迭代中都在距“标记”顶点最小距离处标记顶点。最初,源顶点是距离为 0 的唯一标记顶点。假设存在两个标记顶点 A 和 B,它们与源之间的距离有限,并且它们的路径不重叠。目前,到 A 和 B 的路径将被认为是从 A 到 B 的最短路径。由于路径不重叠,因此从 Source 到 A 到 B 的任何路径的长度都是 source 到 A + 从 A 到路径的长度B 大于从源到 B 的路径,因为从源到 A 和 B 的路径不重叠。但是,如果允许负加权边缘,则 NOT 成立。因为从 A 到 B 的路径长度可能是负。因此 Dijkstra 算法不起作用。也没有简单的方法可以将具有负边的一般图转换为具有非负边的图。 Bellman Ford 适用于任何不包含负加权循环的图。