代码随想录
多源最短路问题。(对边的权值正负没有要求,都可以处理)
定义grid[i][j][k];
grid数组来存图,那就把dp数组命名为 grid。
grid[i][j][k] = m,表示 节点i 到 节点j 以[1...k] 集合为中间节点的最短距离为m。
理解:即i到j在考虑经过k节点的情况下,最短路径,即,可能经过k节点,也有可能不经过k节点.
由此引入递推公式:grid[i][j][k] = min(grid[i][k][k - 1] + grid[k][j][k - 1], grid[i][j][k - 1])
初始化: 这有点像动态规划,既然这样我们就要进行初始化
由于计算k的时候要用到k - 1,那么我们就要初始化grid[i][j][0]
遍历顺序: 我们需要使用到前一次k - 1的计算结果,那么我们就要把k - 1该层的grid[i][j][k - 1]全部计算完我们才能遍历下一层(k).代码如下:
for(int k = 1;k <= n;++k){
for(int i = 1;i <= n;++i){
for(int j = 1;j <= n;++j){
grid[i][j][k] = min(grid[i][k][k - 1] + grid[k][j][k - 1], grid[i][j][k - 1]);
}
}
}
这样就可以得出某节点到某节点的最短路径了.
如果想要得出具体经过了哪些节点,我们可以使用path二维数组来随时更新记录某节点前一节点为什么.然后一直往前推直到源节点.
使用二维数组grid[i][j]即可,因为我们是为了得出最短的路径,每一次都会min,不论是使用本k层已经更新过的grid还是k - 1层更新的grid,只要找出最小值,那他就是最短路径,即:
for(int k = 1;k <= n;++k){
for(int i = 1;i <= n;++i){
for(int j = 1;j <= n;++j){
grid[i][j] = min(grid[i][k] + grid[k][j], grid[i][j]);
}
}
}
floyd算法是求多源最短路径的算法,他是dikstra算法的拓展.
重在理解,一定要理解该算法是怎么运作的,这样才能在实际应用中写出来.