并查集,即把有关系的一部分放到一个集合中。主要函数有两个:
int find(int i){
if(f[i]==i)
return i;
else{
f[i] = find(f[i]);
return f[i];
}
}
这段代码主要实现找到 i 的祖宗以及实现路径压缩,
void merge(int i,int j){
int t1,t2;
t1 = getf(i);
t2 = getf(j);
if(t1!=t2) f[t2] = t1;
}
这段代码主要实现把 t1,t2放到一个集合中。
完整的代码可以如下:
#include<stdio.h>
int f[50010]={0},n,m,k,sum=0;
void init(){
sum=0;
int i;
for(i=1;i<=n;++i)
f[i] = i;
}
int find(int i){
if(f[i]==i)
return i;
else{
f[i] =find(f[i]);
return f[i];
}
}
void merge(int i,int j){
int t1,t2;
t1 = getf(i);
t2 = getf(j);
if(t1!=t2) f[t2] = t1;
}
int main(){
int i,x,y,t=0;
while(scanf("%d %d",&n,&m)!=EOF){
if(n==0&&m==0){
break;
}
init();
t++;
for(i=1;i<=m;++i){
scanf("%d %d",&x,&y);
merge(x,y);
}
for(i=1;i<=n;++i)
if(f[i]==i)
sum++;
printf("Case %d: %d\n",t,sum);}
return 0;
}
对于权重并查集的话则还需要设一个数组,里面存一个数与它父亲节点的关系。