并查集是一种用来管理元素分组情况的数据结构,并查集可以高效的进行如下操作。
● 查询元素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);
}