Floyd-Warshall算法逻辑 - 坚持

时间:2010-04-22 08:45:59

标签: java algorithm revision floyd-warshall

我正在尝试使用这个逻辑来理解adjacency matrix发生了什么,但是我认为它与关于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];

2 个答案:

答案 0 :(得分:7)

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] )

但也许它可以帮助你用三维版本来描绘它,所以你可以更明确地看到所有的状态:

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找到了对州的稍微深入的解释。

答案 1 :(得分:4)

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

它会查看每个节点(k),然后查看每个k - 每个i, j的迭代次数,如果它可以通过{{1}的第一个路径来缩短路径}到i然后从kk

看起来如此:

“我目前从ji的最短路径长度为j,我目前从L0i的最短路径长度为{{ 1}},我目前从kL1的最短路径长度为k

如果我将当前最短路径jL2合并到新路径,该怎么办?这条新路径i to k是否比我目前的最短路径k to j短?如果是这样,它会累积长度i to k to ji to j来计算新的最短路径的长度。“

这意味着L1是从L2k的潜在停留点。