1. 程式人生 > 其它 >並查集的實現

並查集的實現

技術標籤:stlc++

並查集,即把有關係的一部分放到一個集合中。主要函式有兩個:

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; }

對於權重並查集的話則還需要設一個數組,裡面存一個數與它父親節點的關係。