class UnionFindSet
{
private:
vector<int> parent;
vector<int> rank;
int cnt;//connected component
public:
UnionFindSet(int n):parent(n),rank(n,1),cnt(n)
{
iota(parent.begin(),parent.end(),0);
}
int Find(int idx)
{
if(parent[idx]!=idx)
parent[idx]=Find(parent[idx]);
return parent[idx];
}
bool Connect(int idx1,int idx2)
{
int r1=Find(idx1),r2=Find(idx2);
if(r1==r2)//connected
return true;
return false;
}
bool Union(int idx1,int idx2)
{
int r1=Find(idx1),r2=Find(idx2);
if(r1==r2)
return true;
if(rank[r1]>rank[r2])
swap(r1,r2);
rank[r2]+=rank[r1];
parent[r1]=r2;
cnt--;
return false;
}
int getCount()
{
return cnt;
}
};
代码收集0013——并查集
最新推荐文章于 2025-12-19 13:09:49 发布
该博客介绍了并查集(Disjoint Set Union)的数据结构及其使用。内容包括:初始化、查找根节点、判断连接和合并操作,以及计数功能。并查集常用于解决不相交集合的连接问题,如寻找网络中的联通组件。
3463

被折叠的 条评论
为什么被折叠?



