1. 程式人生 > 實用技巧 >11.連通塊中點的數量 並查集

11.連通塊中點的數量 並查集

用並查集維護每個集合中的元素個數

還是用集合來維護連通塊

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N = 100010;
 4 int p[N]; //儲存每個元素父節點是誰
 5 int se[N]; //記錄每一個集合中點的數量
 6 //規定只有根節點的size才有意義 
 7 int find(int x) { //返回x的祖宗節點,即返回x所在集合的編號 ,加上路徑壓縮優化 
 8     if (p[x] != x) {
 9         p[x] = find(p[x]);
10     }
11
return p[x]; 12 } 13 int main() { 14 int n, m; 15 cin >> n >> m; 16 for (int i = 1; i <= n; i++) { 17 p[i] = i; 18 se[i] = 1; //開始時每個連通塊中點的數量為1 19 } 20 while (m--) { 21 string op; 22 int a, b; 23 cin >> op; 24 if
(op == "C") { 25 cin >> a >> b; 26 if (find(a) == find(b)) { //特判 27 continue; 28 } 29 se[find(b)] += se[find(a)]; 30 p[find(a)] = find(b); 31 } else if (op == "Q1"){ 32 cin >> a >> b;
33 if (find(a) == find(b)) { 34 cout << "Yes" << endl; 35 } else { 36 cout << "No" << endl; 37 } 38 } else { 39 cin >> a; 40 cout << se[find(a)] << endl; 41 } 42 } 43 return 0; 44 }