今天刚学flody算法,上午学的时候感到很头痛,虽然只有3个for循环,但如果不明白其中的含义的话,还是感觉好难受,所以特意花了一下午和一晚上,对flody算法仔细研究了一下。
先看一下模板代码(此题为无向图):
#include <stdio.h>
#include <string.h>
const int oo = 1<<28;//oo相当于inf
const int maxn = 1001;
int map[maxn][maxn];
int n, m;
void floyd(){flody算法
for(int k = 1; k <= n; k++){
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
// if(i==j||j==k||i==k)continue;
if(map[i][k]+map[k][j] < map[i][j]){
map[i][j] = map[i][k]+map[k][j];
}
}
}
}
}
void init(){//初始化map数组
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
map[i][j] = oo;
}
map[i][i] = 0;
}
}
int main(){
while(~scanf("%d %d", &n, &m)){
init();
int u, v, w;
for(int i = 0; i < m; i++){
scanf("%d %d %d", &u, &v, &w);
if(map[u][v] > w){ // 这是一个坑,因为两点之间可能有多条路,即相同的两点之间的权值可能有多个权值。
map[u][v] = w;
map[v][u] = w;
}
}
floyd();
scanf("%d %d", &u, &v);
int res = map[u][v];
if(res < oo) printf("%d\n", map[u][v]);
else puts("-1");
}
return 0;
}
如果你看到这篇博客,说明你对flody有了一定的理解。当然如果不理解也没关系,推荐看一个视频http://www.56.com/u11/v_MjM0NDI1NzI.html 从第11分钟看到第17分钟即可。 其中k呢,相当于你从 i 点 到 j 点, 现在你能用K点了,你算一下从 i 直接到 j 的距离 和 借助于k点,再从 i 到 k ,从 k 到再到 j 的距离 ,比较一下大小,然后取较小者。 时间原因,不能再详写了,如果还有什么不明白的话,可以留言.PS: 欢迎同学们交流分享哈!