最短路--关于对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
", 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: 欢迎同学们交流分享哈!

 
每天训练发现我比别人做的好慢,但是理解的更深刻,如果一开始学一个新知识点就搜模板,那么这样的人是走不远的,毕业之后带走的只有思维,什么荣誉,奖杯都已经不重要了。
原文地址:https://www.cnblogs.com/6bing/p/3931272.html