最短路--关于对floyd算法的理解
今天刚学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: 欢迎同学们交流分享哈!
每天训练发现我比别人做的好慢,但是理解的更深刻,如果一开始学一个新知识点就搜模板,那么这样的人是走不远的,毕业之后带走的只有思维,什么荣誉,奖杯都已经不重要了。