并查集(Union-Find)

class UF{
private:
    vector<int> parent;
    vector<int> sz;
    int cnt;

public:
    UF(int n):parent(n), sz(n), cnt(n){
        for(int i = 0; i < n; i++)
        {
            parent[i] = i;
            sz[i] = 1;
        }
    }

    int find(int p){
        while(p != parent[p]){
            parent[p] = parent[parent[p]];
            p = parent[p];
        }
        return p;
    }

    void unite(int p, int q){
        int pRoot = find(p);
        int qRoot = find(q);
        if(pRoot == qRoot)
        {
            return;
        }
        if(sz[pRoot] <= sz[qRoot]){
            parent[pRoot] = qRoot;
            sz[qRoot] += sz[pRoot];
        }else{
            parent[qRoot] = pRoot;
            sz[pRoot] += sz[qRoot];
        }
        cnt--;
        return;
    }

    int getCount(){
        return this->cnt;
    }

};

 

posted @ 2021-01-27 20:05  风不会停息gcc  阅读(59)  评论(0)    收藏  举报