while(x!=j){
i=f[x]; f[x]=j; x=i;
}
return j;
}
bool Union(int x, int y){
int a=find(x), b=find(y);
if(a==b)return false;
if(rank[a]>rank[b])
f[b]=a;
else{
if(rank[a]==rank[b])
++rank[b];
f[a]=b;
}
return true;
}
int main(){
int a,b,c,cas=1;
while(~scanf("%d%d%d",&n,&m,&Q)){
if(!n&&!m&&!Q) break;
for(int i=0; i
arr[i].u=a, arr[i].v=b, arr[i].val=c;
}
for(int i=0; i scanf("%d%d",&a,&b);
q[i].id=i, q[i].u=a, q[i].v=b;
}
init();
memset(vis, 0, sizeof(vis));
memset(ans, -1, sizeof(ans));
sort(arr,arr+m);
for(int i=0; i
for(int j=0; j int a=find(q[j].u), b=find(q[j].v);
if(a==b){
vis[j] = true;
ans[j] = arr[i].val;
}
}
}
}
if(cas!=1) printf("\n");
printf("Case #%d\n", cas++);
for(int i=0; i if(ans[i]==-1) printf("no path\n");
else printf("%d\n", ans[i]);
}
}
return 0;
}
2.Floyd
[cpp]
#include
#include
#include
const int N = 105;
const int INF = 1000000000;
using namespace std;
int d[N][N], n, m, Q;
inline void read_graph(){
for(int i=1; i
for(int j=i+1; j
}
int a,b,c;
for(int i=0; i
d[a][b]=d[b][a]=c;
}
}
inline void Floyd(){
for(int k=1; k<=n; ++k){
for(int i=1; i<=n; ++i){
for(int j=1; j<=n; ++j){
int tmp = max(d[i][k], d[k][j]);
d[i][j] = min(d[i][j], tmp);
}
}
}
}
inline void output(){
int u,v;
for(int i=0; i scanf("%d%d",&u,&v);
if(d[u][v]!=INF) printf("%d\n",d[u][v]);
else printf("no path\n");
}
}
int main(){
int a,b,c,cas=1;
while(~scanf("%d%d%d",&n,&m,&Q)){
if(!n&&!m&&!Q) break;
read_graph();
Floyd();
if(cas!=1) puts("");
printf("Case #%d\n",cas++);
output();
}
return 0;
}