关于floyd-warshall算法的一个疑问
按照《算法导论》上的递归公式,令dij(k)为从顶点i到顶点j,且满足所有中间顶点皆属于集合{1,2,…,k}的一条最短路径的权值。当k=0时,表示i和j之间的路径上没有编号大于0的中间节点,即不存在中间节点。所以dij(0) = wij.根据以上讨论,递归式如下:
wij k=0
dij(k) = {
min( dij(k-1), dik(k-1)+dkj(k-1) ) k>=1
我的疑问如下:
以计算dij(4)为例,假设我们已经计算完了d4 2(2)且d4 2(2)不同于d4 2(1),那么在计算d4 3(2)时,我们会用到d4 2(1)和d2 2(1),但是此时d4 2 (1)已经被更新成d4 2(2)了,我们在实现的时候是不是应该保存d4 2(1)呢?
但是在《算法导论》给出的实现里面(P387)并没有在计算dij(k)前保存dij(k-1)。
我的意思是计算dij(k)时要用到dik(k-1)和dkj(k-1),但是dik(k-1)、dkj(k-1)可能在之前计算的时候已经被更新成dik(k)和dkj(k)了。那么我们实现的时候应该在计算dij(k)前先保存dij(k-1),否则程序就是错的了,至少没有按照之前定义的递归式进行计算。
我想我应该表述的比较清晰了,请大家帮忙看一看,谢了。
d4 2 (2)表示从顶点4到顶点2的且中间节点属于{1,2}的一条最短路径,其余类推。