Floyd算法为什么把k放在最外层?

我之前没有接触过算法设计,这个由于项目中要用,所以想请教大神能不能用通俗的例子解释下循环为什么是kij,而不是ijk。谢谢啦~~~~~ 附,经常看到一…
关注者
228
被浏览
90,457

22 个回答

采用动态规划思想,f[k][i][j]表示ij之间可以通过编号为1...k的节点的最短路径。

初值f[0][i][j]为原图的邻接矩阵。

f[k][i][j]可以从f[k-1][i][j]转移来,表示ij不经过k这个节点。

也可以从f[k-1][i][k]+f[k-1][k][j]转移过来,表示经过k这个点。

意思即f[k][i][j] = min(f[k-1][i][j] , f[k-1][i][k]+f[k-1][k][j])

然后你就会发现f最外层一维空间可以省略,因为f[k]只与f[k-1]有关。

虽然这个算法非常简单,但也需要找点时间理解这个算法,就不会再有这种问题啦。

一句话,Floyd算法的本质是DP,而k是DP的阶段,因此要写最外面。