Floyd-Warshall 算法与循环?

Posted

技术标签:

【中文标题】Floyd-Warshall 算法与循环?【英文标题】:Floyd-Warshall algorithm with loops? 【发布时间】:2016-01-18 20:58:18 【问题描述】:

我正在实现 Floyd-Warshall 算法,我有一个问题: 如果我的图中有一个循环(我的意思是,从 A 到 A 的成本是 1),算法应该输出什么,0(因为从任何节点到同一个节点的成本是 0),或者 1 (因为从 A 到 A 有一条成本为 1 的边?

我没有包含任何代码,因为这只是那个问题。

【问题讨论】:

0 因为这就是答案:) 这也要看循环的权重是否为负。如果允许具有负权重的循环,则通过重复该循环,最短路径的长度可以任意小。 不,负权重的循环是不允许的,所以答案应该是 0...谢谢! 基本上你应该将任意两个不同顶点的距离矩阵初始化为无穷大,在对角线上初始化为零,之后你就不必担心了。 【参考方案1】:

在 Floyd-Warhsall 算法的 Wikipedia article 中有一段明确讨论如何处理负长度的循环,如下所示。

负循环是其边缘总和为负值的循环。在构成负循环的任何一对顶点 i、j 之间没有最短路径,因为从 i 到 j 的路径长度可以任意小(负)。对于具有数值意义的输出,Floyd-Warshall 算法假设没有负循环。然而,如果存在负循环,则可以使用 Floyd-Warshall 算法来检测它们。

包括细节,最终算法的内部工作原理如下。

因此,使用 Floyd-Warshall 算法检测负循环,可以检查路径矩阵的对角线,负数的存在表明该图至少包含一个负循环。

【讨论】:

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

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

Floyd-Warshall算法(最短路)

Floyd-Warshall 算法

任意两点间的最短路问题 Floyd-Warshall算法

Floyd-Warshall 算法-- 最短路径(适合节点密集的图)

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