Audiophobia UVA

来源:互联网 发布:搜索文件软件 编辑:程序博客网 时间:2024/06/06 10:37

题目链接:
Audiophobia UVA - 10048

题目大意:
给一个无向图,有 c<=100 个点,s<=1000 条边,q<=10000 个询问,求给定两点之间的路径上的最大边权值最小。

思路:
规模较小,据说可以用 MST 和 LCA做。
直接用Floyd做即可。

需要注意的是 d数组的初始化。按照一般的做即可,即 d[i][i]=0 ,不连接的记为 inf

注意d[i][j]=min(d[i][j],max(d[i][k],d[k][j]));
k是i->j上的一个点,两条路上选取较大值再比较d[i][j]取较小值。

具体实现:

#include <bits/stdc++.h>using namespace std;typedef long long ll;typedef pair <int,int> pii;#define mem(s,t) memset(s,t,sizeof(s))#define D(v) cout<<#v<<" "<<v<<endl#define inf 0x3f3f3f3f#define pb push_back//#define LOCALconst int mod=1e9+7;const int MAXN =110;int c,s,q;int d[MAXN][MAXN],to[MAXN][MAXN];int main() {#ifdef LOCAL    freopen("in.txt","r",stdin);    freopen("out.txt","w",stdout);#endif    int kase=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++) d[i][j]=(i==j)?0:inf;        for(int i=0;i<s;i++){            int x,y,w;            scanf("%d%d%d",&x,&y,&w);            d[x][y]=d[y][x]=w;        }        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]));                }            }        }        if(kase) puts("");        printf("Case #%d\n",++kase);        for(int i=0;i<q;i++){            int x,y;            scanf("%d%d",&x,&y);            if(d[x][y]!=inf){                printf("%d\n",d[x][y]);            }else puts("no path");        }    }    return 0;}
原创粉丝点击