UVA 10048 Audiophobia(Floyd)

来源:互联网 发布:济南新风向网络 编辑:程序博客网 时间:2024/05/24 00:55
题目地址:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=989

思路:FLoyd过程中将加变为取max,取min变为取max。即对于两点i、j,将k作为中转点,取i->k,k->j最大值,作为最长边,取所有i->k->j最小值,作为i、j两点的最大边权值的最小值。

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int maxn=100+50;const int INF=0x3f3f3f3f;int n,m,q;int g[maxn][maxn];void Floyd(){    for(int k=1;k<=n;k++)    {        for(int i=1;i<=n;i++)        {            for(int j=1;j<=n;j++)               g[i][j]=min(g[i][j],max(g[i][k],g[k][j]));        }    }}int main(){    int cas=0;    while(scanf("%d%d%d",&n,&m,&q)!=EOF&&n)    {        cas++;        if(cas!=1) printf("\n");        printf("Case #%d\n",cas);        for(int i=1;i<=n;i++)            for(int j=1;j<=n;j++)              g[i][j]=INF;        for(int i=0;i<m;i++)        {            int x,y,w;            scanf("%d%d%d",&x,&y,&w);            g[x][y]=w,g[y][x]=w;        }        Floyd();        for(int i=0;i<q;i++)        {            int x,y;            scanf("%d%d",&x,&y);            if(g[x][y]>=INF) printf("no path\n");            else printf("%d\n",g[x][y]);        }    }    return 0;}


0 0
原创粉丝点击