1. 程式人生 > >【模板】並查集 兩種路徑壓縮寫法

【模板】並查集 兩種路徑壓縮寫法

let con while class 模板 union 實踐 return ren

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]++ ; } } };

【模板】並查集 兩種路徑壓縮寫法