UVA-10048(弗洛伊德)

来源:互联网 发布:开封教务网络管理系统 编辑:程序博客网 时间:2024/05/21 21:44

题目链接戳这里

题意:给出一张图,求出从一点到另一点经过的最大权值的最小值

一遍弗洛伊德即可。
map[i][j]=min(map[i][j],max(map[i][k],map[k][j]))

注意是无向图
注意变态的输出方式

代码

#include<stdio.h>#include<string.h>#include<queue>#include<iostream>#include<algorithm>using namespace std;//弗洛伊德const int maxn=105;const int INF=0x3f3f3f3f;int map[maxn][maxn];int main(){    int C,S,Q;    int casen=0;    while(~scanf("%d%d%d",&C,&S,&Q)&&C&&S&&Q)    {        for(int i=1; i<=C; i++)            for(int j=1; j<=C; j++)                map[i][j]=INF;        while(S--)        {            int u,v,w;            scanf("%d%d%d",&u,&v,&w);            if(map[u][v]>w)            {                map[u][v]=w;                map[v][u]=w;//注意是无向图            }        }        for(int k=1; k<=C; k++)            for(int i=1; i<=C; i++)                for(int j=1; j<=C; j++)                    if(map[i][j]>max(map[i][k],map[k][j]))                        map[i][j]=max(map[i][k],map[k][j]);        if(casen)//万恶的PE            printf("\n");        printf("Case #%d\n",++casen);        while(Q--)        {            int u,v;            scanf("%d%d",&u,&v);            map[u][v]==INF?printf("no path\n"):printf("%d\n",map[u][v]);        }    }    return 0;}
0 0
原创粉丝点击