模板并查集 两种路径压缩写法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板并查集 两种路径压缩写法相关的知识,希望对你有一定的参考价值。

class UnionFind{
private:
    int* parent;
    int* rank;
    int count;
public:
    UnionFind(int count){
        parent = new int[count];
        rank = new int[count];
        this->count = count;
        for(int i = 0;i < count; i++){
            parent[i] = i;
            rank[i] = 1;
        }
    }
    ~UnionFind(){
        delete[] parent;
        delete[] rank;
    }

    int find(int p){
        assert(p >= 0&&p < count);
 /*       while(parent[p] != p){
            parent[p] = parent[parent[p]];
            p = parent[p];
        }*/ // 实践更好
        if(p != parent[p])      //理论更好
            parent[p] = find(parent[p]);
        return parent[p];
    }

    bool isConnected(int p,int q){
        return find(p) == find(q);
    }

    void unionElements(int p,int q){
        int pRoot = find(p);
        int qRoot = find(q);
        if(pRoot == qRoot)
            return;


        if(rank[pRoot]  < rank[qRoot]){
            parent[pRoot] = qRoot;
        }else if(rank[pRoot] > rank[qRoot]){
            parent[qRoot] = pRoot;
        }else{
            parent[pRoot] = qRoot;
            rank[qRoot]++ ;
        }
    }
};

 

以上是关于模板并查集 两种路径压缩写法的主要内容,如果未能解决你的问题,请参考以下文章

并查集的两种实现(按秩合并+路径压缩)

并查集模板——核心就是路径压缩

LeetCode﹝并查集ி﹞连通分量个数(套用模板一直爽)

LeetCode﹝并查集ி﹞连通分量个数(套用模板一直爽)

并查集模板整理

模板——最小生成树kruskal算法+并查集数据结构