(代码随想录)floyd算法

代码随想录

用处

多源最短路问题。(对边的权值正负没有要求,都可以处理)

代码

三维数组

定义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算法的拓展.

重在理解,一定要理解该算法是怎么运作的,这样才能在实际应用中写出来.

你可能感兴趣的:(算法)