Floyd-Warshall 算法逻辑 - 卡住了

Posted

技术标签:

【中文标题】Floyd-Warshall 算法逻辑 - 卡住了【英文标题】:Floyd-Warshall Algorithm Logic - Stuck 【发布时间】:2011-02-10 23:20:52 【问题描述】:

我正在尝试使用此逻辑来了解 adjacency matrix 发生了什么,但我很困惑它所说的关于 a b c d 的间隔.....

谁能解释这里发生了什么?

谢谢 (标记为 java 作为它向我们演示的语言,所以如果有人发布任何代码示例,他们可以看到它是用该语言编写的)

http://compprog.wordpress.com/2007/11/15/all-sources-shortest-path-the-floyd-warshall-algorithm/

代码如下:

for (k = 0; k < n; ++k) 
    for (i = 0; i < n; ++i)
        for (j = 0; j < n; ++j)
            /* If i and j are different nodes and if
               the paths between i and k and between
               k and j exist, do */
            if ((dist[i][k] * dist[k][j] != 0) && (i != j))
                /* See if you can't get a shorter path
                   between i and j by interspacing
                   k somewhere along the current
                   path */
                if ((dist[i][k] + dist[k][j] < dist[i][j]) ||
                        (dist[i][j] == 0))
                    dist[i][j] = dist[i][k] + dist[k][j];

【问题讨论】:

@stan:Floyd-Warshall 是典型的“DP 算法”之一,还有 Levenhstein 的编辑距离和“0-1 背包”。要理解它,您需要了解“动态编程”是什么(大多数没有 CS 学位的程序员对 DP 一无所知)。关于这个主题的***条目很好:en.wikipedia.org/wiki/Dynamic_programming,否则你可以尝试参加一些在线比赛(如 TopCoder),通常很多问题都需要 DP 解决方案。 【参考方案1】:

Floyd-Warshall 是一个dynamic programming 问题。

在二维版本中编写它几乎是标准的(并且更容易):

for ( int k = 0; k < n; k++ )
   for ( int i = 0; i < n; i++ )
      for ( int j = 0; j < n; j++ )
          dist[i][j] = min( dist[i][k] + dist[k][j], dist[i][j] )

但也许它可以帮助你用 3 维版本来描绘它,这样你就可以更清楚地看到所有状态:

for ( int k = 0; k < n; k++ )
   for ( int i = 0; i < n; i++ )
      for ( int j = 0; j < n; j++ )
          dist[k][i][j] = min( dist[k-1][i][k] + dist[k-1][k][j], dist[k-1][i][j] )

在Algorithmist 可以找到对这些状态的更深入的解释。

【讨论】:

我认为在你的最后一行代码中应该有 dist[k-1][i][j] 而不是 dist[i][j]【参考方案2】:

Floyd-Warshall 算法执行以下操作:

它查看每个节点 (k),然后查看每个 k-iteration 的每个 i, j,如果它可以通过先从 ik 然后从kj

看起来是这样的:

“我目前从ij的最短路径长度为L0,我目前从ik的最短路径长度为L1,我目前从k的最短路径到j 的长度为L2

如果我将当前最短的路径i to kk to j 组合成一条新路径会怎样?这条新路径i to k to j 是否比我当前最短的路径i to j 短?如果是这样,它会累积 L1L2 的长度来计算新的最短路径的长度。”

这意味着,k 是从ij 的潜在中转站。

【讨论】:

以上是关于Floyd-Warshall 算法逻辑 - 卡住了的主要内容,如果未能解决你的问题,请参考以下文章

Floyd-Warshall算法及其并行化实现(基于MPI)

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

Floyd-Warshall 算法与循环?

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

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

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