图论-Floyd算法

/*
枚举顶点k范围[1,n] 
    以k为中介点,枚举所有定点对i和j.i和j的范围[1,n]
        if(dis[i][k]+dis[k][j]<dis[i][j])
            dis[i][j]=dis[i][k]+dis[k][j];
*/
#include<cstdio>
#include<algorithm>
using namespace std;
const int INF = 0xFFFFFFF;
const int MAXV = 200;
int n,m;
int dis[MAXV][MAXV];
void Floyd()
{
    for(int k=0;k<n;k++)
    {
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(dis[i][k]!=INF && dis[k][j]!=INF && dis[i][k]+dis[k][j]<dis[i][j])
                    dis[i][j]=dis[i][k]+dis[k][j];
            }
        }
    }
} 
int main(void)
{
    int u,v,w;
    fill(dis[0],dis[0]+MAXV*MAXV,INF);
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++) dis[i][i]=0;
    for(int i=0;i<m;i++)
    {
        scanf("%d%d%d",&u,&v,&w);
        dis[u][v]=w; 
    }
    Floyd();
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            printf("%d   ",dis[i][j]);
        }
        printf("
");
    }
    return 0;
}
/*
input: 
6 8
0 1 1
0 3 4
0 4 4
1 3 2
2 5 1
3 2 2
3 4 3
4 5 3
output: 
0   1   5   3   4   6
268435455   0   4   2   5   5
268435455   268435455   0   268435455   268435455   1
268435455   268435455   2   0   3   3
268435455   268435455   268435455   268435455   0   3
268435455   268435455   268435455   268435455   268435455   0
*/
原文地址:https://www.cnblogs.com/zuimeiyujianni/p/8847975.html