如何在 Floyd-Warshall 算法中找到最短路径和最短成本

Posted

技术标签:

【中文标题】如何在 Floyd-Warshall 算法中找到最短路径和最短成本【英文标题】:How to find shortest route along with shortest cost in Floyd-Warshal Algorithm 【发布时间】:2021-12-14 01:14:27 【问题描述】:

我们知道 Floyd-Warshal 算法为我们提供了从任何其他节点到任何节点的最短成本/路径。

例如:

根据上图,我们可以通过 Floyd-Warshal 算法得到下面的矩阵作为所有对最短路径(成本)

如果你想从节点 4 到节点 3,那么有两种方法

4 --> 2 --> 3(成本为 2) 4 --> 2 --> 1 --> 3(成本为 1。所以这是最短路线)

从矩阵中我们看到第 4 行和第 3 列的值为 1。所以这向我们展示了这两个节点之间的最短成本。

现在我的问题是 -

我怎样才能得到路线以及(4-->2-->1-->3)?

【问题讨论】:

【参考方案1】:

当您有负边成本时,诀窍是将最小成本的绝对值添加到每个边(以便所有边的成本为零或正)在您的示例中,将每个边成本加 2。

那么就可以按照通常的方式找到最便宜的路径了。

【讨论】:

这是不正确的,反例:G = (a,b) : 5, (b,c) : 2, (c,a) : -10,假设你从a开始,你可以无限循环不断减少距离。 你的方法在没有负循环的情况下也不起作用,反例:G = (a,b) : 5, (b,c) : -10, (a,c) : 2,那么来自a的最便宜的路径是(a->b) : 2(a->b->c): -5。使用您的方法,它指出最便宜的路径是 (a->b) : 15(a->c) : 12,这对于路径 a->c 是不正确的。 @idog 你需要仔细阅读我的回答。 其实我并没有要求找到最小成本,而是问我如何才能找到最小路径的路线?比如,A ---> C ---> D 我很困惑。在您的帖子中,您为顶点编号(1,2,3,...)在您的评论中,您给它们字母(A,C,D)。你能澄清一下吗?

以上是关于如何在 Floyd-Warshall 算法中找到最短路径和最短成本的主要内容,如果未能解决你的问题,请参考以下文章

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

Dijkstra vs. Floyd-Warshall:在所有节点对上寻找最优路径

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

Floyd-Warshall 算法:获得最短路径

Floyd-Warshall 算法返回具有相同权重的每条最短路径

多源最短路径--Floyd-Warshall算法