C++ 並查集實作

並查集,適用於高速判斷AB是否再同一組,以及合併兩組。

#include<bits/stdc++.h>
using namespace std;

class dsu{
    private:
        vector<int> p;
        vector<long long> rank;
    public:
        void init(int n){
            for(int i=0;i<=n;i++){
                p.push_back(i);
                rank.push_back(1);
            }
        }
        
        int find(int a){
            if(a==p[a]) return a;
            return p[a]=find(p[a]);
        }
        
        bool same(int a,int b){
            return find(a)==find(b);
        }
        
        bool uni(int a,int b){
            if(!same(a,b)){
                int rA=rank[find(a)],rB=rank[find(b)];
                if(rA>rB){
                    p[find(b)]=p[find(a)];
                }else if(rA==rB){
                    p[find(b)]=p[find(a)];
                    rank[p[find(a)]]++;
                }else{
                    p[find(a)]=p[find(b)];
                }
            }
        }
};

包含路徑壓縮與啟發式合併。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *