【自用】并查集模板
作者:
沧996
,
2021-08-15 02:40:33
,
所有人可见
,
阅读 282
vector<int> father,fsize;
//初始化,让箭头指向自己
//此时,每个集合相互独立,因此集合中点的数量(连通块数量)都为1
void init(int n){
for(int i=0;i<n;i++){
father.push_back(i);
fsize.push_back(1);
}
}
//寻找父结点
int find(int x){
if(x==father[x]) return x;
father[x]=find(father[x]); //使用路径压缩
return father[x];
}
//将两个点连接
bool join(int a,int b){
int fa=find(a);
int fb=find(b);
bool res=(fa==fb); //同时判断两个点之前是否有同一个父节点
if(!res){
fsize[fa]+=fsize[fb]; //如果不在同一个父节点上,在新的根节点上加上当前结点的个数
father[fb]=fa;
}
return res;
}