並查集,適用於高速判斷AB是否再同一組,以及合併兩組。
包含路徑壓縮與啟發式合併。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| #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)]; } } } };
|