并查集必背模板

class UnionFind{
public:
    UnionFind(int n){
        parent = vector<int>(n);
        rank   = vector<int>(n);
        for(int i = 0; i < n; i++)
            parent[i] = i;
    }
    
    void uni(int x, int y)
    {
        int rootx = find(x);
        int rooty = find(y);
        if(rootx != rooty){
            if(rank[rootx] > rank[rooty])
                parent[rooty] = rootx;
            else if(rank[rootx] < rank[rooty])
                parent[rootx] = rooty;
            else {
                parent[rooty] = rootx;
                rank[rootx]++;
            }
        }
        
    }
    
    int find(int x)
    {
        if(parent[x] != x)
            parent[x] = find(parent[x]);
        return parent[x];
    }
private:
    vector<int> parent;
    vector<int> rank;
};
posted @ 2022-08-01 16:06  静候佳茵  阅读(18)  评论(0编辑  收藏  举报