Floyd算法

Floyd算法适用于多源最短路径问题(即所有顶点之间的最短路径),使用注意事项:

(1)可以有负权边,但不能有负环

(2)适用于所有类型的图(因为时间复杂度的限制,顶点数不能太多)

存储结构采用邻接矩阵,n为顶点数,m为边数

int dis[n][n];

memset(dis, 0x3f, sizeof(dis));
for (int i = 0; i < n; i++) dis[i][i] = 0;

Floyd算法基于动态规划

for (int k = 0; k < n; k++)
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);

算法结束时,dis[i][j]存储顶点i到顶点j的最短距离,dis[i][j] > 0x3f3f3f3f/2表明不可达(由于对图中所有边进行松弛操作并且有负权边,就算ij不连通,dis[i][j]也可能被更新)