图论 Floyd算法
Floyd算法
时间复杂度O (n^3)
空间复杂度O (n^2)
用处
可以求任意两个点之间的最短路径长度。
得出的邻接矩阵存储 i 到 j 的最短路径长度。
无法解决“负权环问题”
1 ____ -2
\ /
3
思路(摘自知乎作者-赵轩昂)
采用动态规划思想,表示和之间可以通过编号不超过()的节点的最短路径。
初值为原图的邻接矩阵。
则可以从转移来,表示到不经过这个节点。
也可以从转移过来,表示经过这个点。
意思即
然后你就会发现最外层一维空间可以省略,因为只与有关。
初始化
用邻接矩阵表示,
f[i][j]初始化为 i 到 j 的距离,
如果 i 无法到达 j 则 f[i][j] = INF;
//初始化 for(int i=0;i<N;++i){ for(int j=0;j<N;++j){ if(i==j) f[i][j] = 0; else f[i][j] = INF; } } //读入边 for(int i=1;i<=m;i++){ cin >> t1 >> t2 >> t3; f[t1][t2] = t3; }
核心代码:
for(int k=0;k<n;++k){ for(int i=0;i<n;++i){ for(int j=0;j<n;++j){ f[i][j] = min(f[i][j],f[i][k] + f[j][k]); } } }