并查集 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/