并查集用来管理 相互关联的元素的分组情况,但只能进行合并,不能分割:
- 查询a,b是否在同一组
- 合并a,b所在的组
int father[maxn];//记录父亲节点
int rank[maxn];//数的高度 初始为0
void init(){
for(int i=0;i<n;i++){
father[i]=i
rank[i]=0;
}
}
int findfather(int x){
if(x!=father[x]){
father[x]=findfather(father[x]);
}
return father[x];
}
void unio(int x,int y){ //把y指向X 也可以用判断秩的个数
x=findfather(x);
y=findfather(y);
if(x==y)return;
else{
father[y]=x;
}
//或者
else{
if(rank[x]>rank[y]){
father[y]=x;
rank[x]+=rank[y];
}
else{
father[x]=y;
rank[y]+=rank[x];
}
}
}