题目链接:
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 LOCAL
const 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;
}