UVA 10048 Flyod算法

来源:互联网 发布:网站源码有什么用 编辑:程序博客网 时间:2024/06/16 07:27

题意

给C个点,S条边,Q次查询。每次查询查询两个点之间边最大值最小的路径。求这个路径的边最大值。

题解

Flyod简单变形,d[i][j]=min(d[i][j],max(d[i][k],d[k][j]))即可

注意事项

输出好坑,非常容易PE。注意空行和空行输出位置!!!

代码

#include <iostream>#include<cstdio>#include<algorithm>#define INF 1e9using namespace std;int d[1010][1010];int c,s,q;void floyd(){    for(int k=1;k<=c;k++){        for(int i=1;i<=c;i++){            for(int j=1;j<=c;j++){                d[i][j]=min(d[i][j],max(d[i][k],d[k][j]));            }        }    }}int main(){    int kase=1;    while(scanf("%d%d%d",&c,&s,&q)){        if(c+s+q==0)            break;        for(int i=1;i<=c;i++){            for(int j=1;j<=c;j++){                d[i][j]=INF;                d[j][i]=INF;            }        }        for(int i=0;i<s;i++){            int a,b,w;            scanf("%d%d%d",&a,&b,&w);            d[a][b]=w;            d[b][a]=w;        }        floyd();        if(kase-1){            printf("\n");        }        printf("Case #%d\n",kase++);        for(int i=0;i<q;i++){            int a,b;            scanf("%d%d",&a,&b);            if(d[a][b]<INF)                printf("%d\n",d[a][b]);            else                printf("no path\n");        }    }    return 0;}
0 0