并查集是一种用来管理元素分组情况的数据结构,并查集可以高效的进行如下操作。
● 查询元素a和元素b是否属于同一组。
● 合并元素a和元素b所在的组。
首先初始化,n个节点来表示n个元素,最开始没有边
void init(int n){ for(int i=1;i<=n;i++){ par[i]=i; rank[i]=0; }
接着需要查询树的根,我们知道per[son]=father,其中son是子节点,father是父节点,我们用per[i]指向的是其父节点,其中根节点per[root]==root。
int find(int x){ if(par[x]==x) return x; else return par[x]=find(par[x]);\\进行状态压缩 }
然后我们可以对不同集合进行合并,对于每棵树,记录这棵树的高度(rank),合并时rank小的连相rank大的边。
void unite(int x,int y){ x=find(x); y=find(y); if(x==y) return ; else{ if(rank[x]<rank[y]){ par[x]=y; }else{ par[y]=x; if(rank[x]==rank[y]) rank[x]++; } } }
在此我们可以通过find()返回的根节点可知,若返回的根节点一样,则再同一集合,反之,不再同一集合
bool same(int x,int y){ return find(x)==find(y); }