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——并查集
最新推荐文章于 2024-06-16 09:50:41 发布