为啥全对最短路径算法使用负权重?

Posted

技术标签:

【中文标题】为啥全对最短路径算法使用负权重?【英文标题】:Why do all-pair shortest path algorithms work with negative weights?为什么全对最短路径算法使用负权重? 【发布时间】:2014-05-18 10:57:30 【问题描述】:

我最近一直在研究全对最短路径算法,例如 Floyd-Warshall 和 Johnson 的算法,我注意到即使图包含负权重边(但不包含负权重循环),这些算法也会产生正确的解决方案.为了比较,Dijkstra 的算法(它是单源最短路径)不适用于负权重边缘。是什么让全对最短路径算法在负权重下工作?

【问题讨论】:

了解 Dijkstra 的算法不能使用负权重的原因可能很有启发性:***.com/questions/13159337/… 【参考方案1】:

Floyd Warshall 的所有对最短路径算法适用于具有负边权重的图,因为该算法的正确性不依赖于边权重是否为非负,而 Dijkstra 算法的正确性基于此事实。

Dijkstra 算法的正确性:

在算法的任何步骤中,我们都有 2 组顶点。集合 A 由我们计算到的最短路径的顶点组成。集合 B 由剩余的顶点组成。

归纳假设:在每一步,我们都会假设所有之前的迭代都是正确的。

归纳步骤:当我们在集合 A 中添加一个顶点 V 并设置距离为 dist[V] 时,我们必须证明这个距离是最优的。如果这不是最优的,那么必须有一些其他路径到顶点 V 的长度更短。

假设这条其他路径经过集合 B 中的某个顶点 X。

现在,由于 dist[V] <= dist[X] ,因此到 V 的任何其他路径将至少为 dist[V] 长度,除非图形具有负边长度。

Floyd Warshall 算法的正确性: 从顶点 S 到顶点 T 的任何路径都将通过图中的任何其他顶点 U。因此,从 S 到 T 的最短路径可以计算为

min( shortest_path(S to U) + shortest_path(U to T)) 用于图中所有顶点 U。

如您所见,只要子调用正确计算路径,图形的边就不会是非负的。只要基础案例已正确初始化,子调用就会正确计算路径。

【讨论】:

你不能只说“现在,因为 dist[V] in B.”,并解释为什么没有必要考虑 X 所在的情况A. 如果路径必须经过集合 A 的某个顶点,那么它将直接从该顶点开始。我认为这太基本了,不能添加。但是我补充说“X 在 B 组中”。感谢您指出。【参考方案2】:

Dijkstra 算法不适用于负权边,因为它基于贪婪策略(假设),即一旦将顶点 v 添加到集合 S,d[v] 包含可能的最小距离。

但是如果 Q 中的最后一个顶点被添加到 S 并且它有一些传出的负权边。负边缘对距离的影响不计在内。

但是,所有对最短路径算法都会捕获这些更新。

【讨论】:

以上是关于为啥全对最短路径算法使用负权重?的主要内容,如果未能解决你的问题,请参考以下文章

在非加权图中找到最短路径

算法笔记-----单源最短路径之Bellman-Ford算法

Floyd最短路(带路径输出)

数据结构8——最短路径

[总结]最短路径算法

Dijkstra 的最短路径算法不返回权重最小的最短路径