我读了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内的距离内将原始矩阵中的最短路径距离存储起来?
这张照片显示我们需要D0,D1,D2 ...... D(n)
答案 0 :(得分:0)
你在这里部分正确。
Floyd Warshall算法的输出(即NxN矩阵)DOESN' T有助于重建任意两个给定顶点之间的实际最短路径。
如果我们保留父矩阵P,则可以恢复这些路径,以便它存储用于每个顶点对(x,y)的最后一个中间顶点。说这个值是k。
从x到y的最短路径是从x到k的最短路径与从k到y的最短路径的串联,可以在给定矩阵P的情况下递归地重建。
但请注意,大多数全对应用程序只需要生成的距离矩阵。这些作业是Floyd算法的设计目标。
答案 1 :(得分:0)
您是正确的,因为原始公式要求步骤k
的计算需要使用步骤k-1
的计算:
如果您说第一矩阵用于存储步骤k-1
的值,第二矩阵用于存储k
的值,而第一个矩阵又用于存储值,则可以轻松组织来自k+1
等
但是,如果我们在更新值时使用相同的矩阵,则在上式中,如果索引i,k
的值在更新过程中已被更新,则可能会意外地使用而不是。当前一轮k
,或者如果索引k,j
的值已更新,我们可能会得到而不是。因为我们使用了错误的递归更新公式,这不会违反算法吗?
嗯,不是真的。请记住,Floyd-Warshall算法处理“无负循环”约束,这意味着不存在边的总和为负值的循环。这意味着对于任何k
,从节点k
到节点k
的最短路径是0
(否则,这意味着从k
到路径{ k
,边的总和为负值)。因此,根据定义:
现在,让我们采用第一个公式,并将j
替换为k
:
然后将相同的公式'i'替换为'k':
因此,基本上,与的值相同,而与的值相同,因此这些值是否真正无关紧要值在周期“ k”期间是否更新,因此您可以在读取矩阵时更新同一矩阵而不会破坏算法。