为什么弗洛伊德warshall只使用一个距离矩阵?

时间:2015-06-15 02:41:40

标签: c++ c algorithm graph floyd-warshall

我读了floyd 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矩阵。 一个存储当前最短路径在顶点k-1, 另一个存储顶点k内的最短路径, 然后第一个存储k + 1内的最短路径, .... 如何在顶点k-1内的距离内将原始矩阵中的最短路径距离存储起来?

enter image description here

这张照片显示我们需要D0,D1,D2 ...... D(n)

2 个答案:

答案 0 :(得分:0)

你在这里部分正确。

Floyd Warshall算法的输出(即NxN矩阵)DOESN' T有助于重建任意两个给定顶点之间的实际最短路径。

如果我们保留父矩阵P,则可以恢复这些路径,以便它存储用于每个顶点对(x,y)的最后一个中间顶点。说这个值是k。

从x到y的最短路径是从x到k的最短路径与从k到y的最短路径的串联,可以在给定矩阵P的情况下递归地重建。

但请注意,大多数全对应用程序只需要生成的距离矩阵。这些作业是Floyd算法的设计目标。

答案 1 :(得分:0)

您是正确的,因为原始公式要求步骤k的计算需要使用步骤k-1的计算:

formula

如果您说第一矩阵用于存储步骤k-1的值,第二矩阵用于存储k的值,而第一个矩阵又用于存储值,则可以轻松组织来自k+1

但是,如果我们在更新值时使用相同的矩阵,则在上式中,如果索引i,k的值在更新过程中已被更新,则可能会意外地使用formula而不是formula。当前一轮k,或者如果索引k,j的值已更新,我们可能会得到formula而不是formula。因为我们使用了错误的递归更新公式,这不会违反算法吗?

嗯,不是真的。请记住,Floyd-Warshall算法处理“无负循环”约束,这意味着不存在边的总和为负值的循环。这意味着对于任何k,从节点k到节点k的最短路径是0(否则,这意味着从k到路径{ k,边的总和为负值)。因此,根据定义:

formula

现在,让我们采用第一个公式,并将j替换为k

formula

然后将相同的公式'i'替换为'k':

formula

因此,基本上,formulaformula的值相同,而formulaformula的值相同,因此这些值是否真正无关紧要值在周期“ k”期间是否更新,因此您可以在读取矩阵时更新同一矩阵而不会破坏算法。