适用于负循环的 Floyd-Warshall 算法 [关闭]

Posted

技术标签:

【中文标题】适用于负循环的 Floyd-Warshall 算法 [关闭]【英文标题】:Floyd-Warshall Algorithm that works with negative cycles [closed] 【发布时间】:2015-04-26 13:09:17 【问题描述】:

如何修改 Floyd-Warshall 算法以找到保持 O(V^3) 时间复杂度的有向图的任何负成本循环的最短路径?

【问题讨论】:

【参考方案1】:

对于每条路径,在负循环图中没有最短路径 - 可以通过再遍历循环一次来找到更短的路径。

如果您指的是最短简单路径(每个顶点最多可以访问一次)- 除非P=NP,否则无法完成,而且很可能不是。

假设您有一个有效的最短简单路径算法A。 给定Longest Path Problem 的一个实例和一个图形G=(V,E,w),创建一个新图形G'=(V,E,w'),其中w'(u,v) = -1*w(u,v)。现在在G' 上调用A,你得到了G' 上最短的简单路径——这是G 上最长的路径。

但是,由于最长路径是 NP-Hard - 除非 P=NP,否则这样的解决方案是不可能的。


tl;博士:

在负循环图中,不存在最短路径。 您无法在 O(V^3) 时间的负循环图中找到最短的简单路径(除非 P=NP,即使这样也不一定是 O(V^3))。

【讨论】:

这就是我的想法,没有最短路径是有道理的,因为循环的每次迭代都会导致“更小”的权重。但是,我在家庭作业和网上查找时遇到了这个问题。我的直觉告诉我答案是没有这样的修改可以使该算法适用于负循环。 “在具有负循环的图中,没有最短路径之类的东西”:是的,至少如果您的意思是“有限最短路径”。但是可以使用简单的广度优先搜索找到边数最少的负循环,而且“任何负成本循环的最短路径”很可能就是这个意思。 您能否详细说明如何使用 BFS 找到负循环的最小边数?

以上是关于适用于负循环的 Floyd-Warshall 算法 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Floyd-Warshall 算法的最小权重循环

Floyd

Floyd-Warshall算法(最短路)

最短路径的floyd算法的时间复杂度

Rust 中的快速惯用 Floyd-Warshall 算法

Floyd-Warshall 算法