并查集模板

使用并查集时,首先会存在一组不相交的动态集合 $S = \left\{ {{S_1},{S_2}, \cdots ,{S_k}} \right\}$,一般都会使用一个整数表示集合中的一个元素。

每个集合可能包含一个或多个元素,并选出集合中的某个元素作为代表。每个集合中具体包含了哪些元素是不关心的,具体选择哪个元素作为代表一般也是不关心的。我们关心的是,对于给定的元素,可以很快的找到这个元素所在的集合(的代表),以及合并两个元素所在的集合,而且这些操作的时间复杂度都是常数级的。

并查集主要包含三个操作:
1.  makeSet

2.  unionSet

3.  find

int maxn=10010;
int f[maxn],rank[maxn]; 

void makeSet(int n){
    for(int i=0;i<=n;i++){
        f[i]=i;
        rank[i]=0;
    }
}

int find(int r){
    while(f[r]!=r)
    {
        f[x]=find(f[x]);    
    }
    return f[x];
}

void unionSet(int x,int y){
    x=find(x);y=find(y);
    if(x==y) return;
    if(rank[x]>rank[y]){
        f[y]=x;
    }
    else{
        if(rank[x]==rank[y]){
            rank[y]++;
        }
        f[x]=y;
    }
}

 

posted @ 2019-08-06 20:51  dynmi  阅读(766)  评论(0编辑  收藏  举报