UVa 10048 - Audiophobia(Floyd, Kruskal)(二)

2014-11-24 10:18:17 · 作者: · 浏览: 1
]) j=f[j];
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 scanf("%d%d%d",&a,&b,&c);
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 if(Union(arr[i].u,arr[i].v)){
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 d[i][i] = INF;
for(int j=i+1; j d[i][j]=d[j][i]=INF;
}
int a,b,c;
for(int i=0; i scanf("%d%d%d",&a,&b,&c);
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;
}