Floyd-Warshall 算法是如何工作的,K 是啥?

Posted

技术标签:

【中文标题】Floyd-Warshall 算法是如何工作的,K 是啥?【英文标题】:How does Floyd-Warshall algorthm work and what is K?Floyd-Warshall 算法是如何工作的,K 是什么? 【发布时间】:2012-01-04 19:25:31 【问题描述】:

我很难理解Floyd-Warshall algorithm。我知道它是如何工作的 就像我知道如何用手做一样,但我需要通过电脑来理解 有洞察力。

FOR k <-- 1 TO N DO
    FOR i <-- 1 TO N DO
        FOR j <-- TO N DO 
            IF Djk + Dkj < DiJ THEN
                Dij <-- djk + dkj 

kij 是迭代变量,它会迭代直到 n 值,我猜 它是一个嵌套循环,然后它查看每个节点的次数少于它找到最短路径吗?

【问题讨论】:

或访问cstheory.stackexchange.com cstheory 是针对研究级 CS 的,所以问题属于这里。也就是说,OP 需要处理这 0 个赞成票和 0 个接受的答案 你的算法错了——应该是 Dik + Dkj 【参考方案1】:

在 Floyd-Warshall 中,k 的一个非常简化的含义是图中的“路点”。最后两行可以解释如下:“如果你可以从 i 到 k,然后从 k 到 j,通过你迄今为止找到的任何路径,比从 i 到 j 更快,那么从 i 到 j 到 k 的路径变为新的最短路径”。

【讨论】:

【参考方案2】:

K 表示中间顶点。所以,外循环基本上说让第 K 个顶点作为中间停止点。内部的两个循环然后检查邻接矩阵中的每个项目,并检查使用 K 的距离(使用 K 作为中间顶点)是否小于从顶点 i 到 j 的距离(位置 i,j 在邻接矩阵 )。如果距离更小,则更新 d[i,j]。

【讨论】:

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

算法Floyd-Warshall算法(任意两点间的最短路问题)(判断负圈)

Floyd-Warshall 算法逻辑 - 卡住了

多源最短路径 – Floyd-Warshall Algorithm

Floyd-Warshall算法正确性证明

如何在 Floyd-Warshall 算法中输出最短路径?

在 Haskell 中 Floyd-Warshall 的表现——修复空间泄漏