我最近一直在研究所有对最短路径算法,例如Floyd-Warshall和Johnson的算法,我注意到即使图表包含负权重,这些算法也会产生正确的解决方案边缘(但不是负重量周期)。为了比较,Dijkstra的算法(它是单源最短路径)不适用于负权重边缘。是什么让全对最短路径算法与负权重一起工作?
答案 0 :(得分:5)
Dijkstra算法的正确性:
我们在算法的任何步骤都有2组顶点。集合A由我们计算最短路径的顶点组成。集B由剩余的顶点组成。
归纳假设:在每一步我们都会假设所有先前的迭代都是正确的。
归纳步骤:当我们将一个顶点V添加到集合A并将距离设置为dist [V]时,我们必须证明该距离是最佳的。如果这不是最优的,则必须有一些到顶点V的其他路径,其长度较短。
假设这个其他路径经过集合B中的某个顶点X
现在,从dist[V] <= dist[X]
起,因此除了图形具有负边长之外,到V的任何其他路径都将是至少dist [V]长度。
Floyd Warshall算法的正确性 从顶点S到顶点T的任何路径都将穿过图形的任何其他顶点U.因此,从S到T的最短路径可以计算为
对于图中的所有顶点U,min(shortest_path(S到U)+ shortest_path(U到T))。
正如您所看到的,只要子调用正确计算路径,就不会将图形的边缘依赖于非负值。只要基本案例已正确初始化,子调用就会正确计算路径。
答案 1 :(得分:0)
Dijkstra算法不适用于负权重边缘,因为它基于贪婪策略(假设),一旦顶点v被添加到集合S,d [v]包含最小值距离可能。
但是如果Q中的最后一个顶点被添加到S并且它有一些输出的负权重边。由负边缘引起的对距离的影响不会被计算。
但是,所有对最短路径算法都会捕获这些更新。