为啥全对最短路径算法使用负权重?
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 并且它有一些传出的负权边。负边缘对距离的影响不计在内。
但是,所有对最短路径算法都会捕获这些更新。
【讨论】:
以上是关于为啥全对最短路径算法使用负权重?的主要内容,如果未能解决你的问题,请参考以下文章