并查集 Disjoint-set data
并查集,正如其名,主要功能就是合并,查询的一个集合。算法简述
常用于 求连通分量。常见疑惑的说明:
代码实现
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;
}
};
| 时间复杂度 | 空间复杂度 | 补充说明 | 适用范围 | |
|---|---|---|---|---|
| \(O(n)\) | \(O(n)\) | 无 | 无 |
例题:
力扣990 等式方程的可满足性 https://leetcode-cn.com/problems/satisfiability-of-equality-equations/