图论 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]);
}
}
}
转载于//www.cnblogs.com/--zz/p/10623044.html
还没有评论,来说两句吧...