如何在 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:在所有节点对上寻找最优路径