【发布时间】:2015-08-30 10:43:09
【问题描述】:
我阅读了弗洛伊德 Warshall 算法的伪代码
1 let dist be a |V| × |V| array of minimum distances initialized to ∞ (infinity)
2 for each vertex v
3 dist[v][v] ← 0
4 for each edge (u,v)
5 dist[u][v] ← w(u,v) // the weight of the edge (u,v)
6 for k from 1 to |V|
7 for i from 1 to |V|
8 for j from 1 to |V|
9 if dist[i][j] > dist[i][k] + dist[k][j]
10 dist[i][j] ← dist[i][k] + dist[k][j]
11 end if
但它只是使用一个 dist 矩阵来节省距离。
我认为应该有 n 个 dist 矩阵,其中 n 是顶点数,
或者至少我们需要两个 dist 矩阵。
1 存储顶点 k-1 内的当前最短路径,
另一个存储顶点 k 内的最短路径,
然后第一个存储 k+1 内的最短路径,
……
对于顶点 k-1 内的距离,我们如何才能将顶点 k 内的新最短路径距离存储在原始矩阵中?
这张图显示我们需要 D0, D1, D2....D(n)
【问题讨论】:
-
这是一个二维矩阵,其中 dist[i][j] 存储从节点 i 到节点 j 的距离。该算法的一大优点是它可以在原地工作。不需要额外的矩阵。仔细研究,你就会明白为什么......
-
这对迭代进行编号以帮助数学证明正确性。这是一种常见的证明技术。这并不意味着需要 3d 矩阵。如果需要 3d 矩阵,则将 k 作为第三个下标。正如我所说,如果你仔细分析它,你就会明白为什么只需要一个矩阵。
标签: c++ c algorithm graph floyd-warshall