並查集的實現
阿新 • • 發佈:2021-01-23
並查集,即把有關係的一部分放到一個集合中。主要函式有兩個:
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;
}
對於權重並查集的話則還需要設一個數組,裡面存一個數與它父親節點的關係。