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
表明不可达(由于对图中所有边进行松弛操作并且有负权边,就算i
和j
不连通,dis[i][j]
也可能被更新)