Floyd 全局最短路算法 O(n^3)

用Dis数组(二维)存放从i到j的距离,然后枚举一个k点,尝试用Dis[i][k]+Dis[k][j] 更新Dis[i][j]
三重循环(k→i→j) 所以O(n^3)的时间复杂度 呵呵

代码实现

#include<iostream>
#include<cstring>
#include<algorithm> 
using namespace std;
int main(){
    int n,m;    //有n个点,m条边 
    cin>>n>>m;
    int Dis[n+1][n+1];
    memset(Dis,0x3f,sizeof(Dis));   //一开始谁到谁都是无穷远 
    for(int i=0;i<m;i++){   //这是初始边的读入 
        int x,y,w;
        cin>>x>>y>>w;
        Dis[x][y]=Dis[y][x]=w;
    }
    for(int i=1;i<=n;i++)   //总觉得到自己还是0比较好,至少下面输出的时候整齐点 
        Dis[i][i]=0;
    //初始化完成 
    for(int k=1;k<=n;k++)   //用k点更新Dis 
        for(int i=1;i<=n;i++)
            for(int j=1;j<i;j++){
                Dis[i][j]=Dis[j][i]=min(Dis[i][j],Dis[i][k]+Dis[k][j]);
            }
    cout<<endl;     //下面开始输出Dis数组,如果题目不要求输出请注释掉 
    for(int i=1;i<=n;i++,cout<<endl)
        for(int j=1;j<=n;j++)
            cout<<Dis[i][j]<<" ";
    return 0;
}

ahalei老师的Blog直通车
马桶上的算法一向是幽默易懂的,大家都知道 (●’◡’●)

By YOUSIKI

你可能感兴趣的:(算法)