1. 程式人生 > 實用技巧 >10.合併集合 並查集

10.合併集合 並查集

並查集的作用

並查集是用樹的形式維護所有集合

每一個集合用一個樹來維護

每一個集合的編號是它根節點的編號

令每一個樹根的p[x] = x

然後對於每一個點,都儲存一下這個點的父節點是誰,p[x] = ?

然後當我們想求某個點屬於哪個集合的時候

就找到這個點的father,然後看其是不是樹根,不是的話就繼續向上找。尋根問祖,追本溯源,找它祖宗

在問題2中,可以優化,用路徑壓縮

在x找到它的根節點時,把這條路徑上所有點的父節點都直接指向根節點 ------路徑壓縮

並查集加了這一個優化之後,就可以看成是O(1)的時間複雜度了

 1 #include <bits/stdc++.h>
 2
using namespace std; 3 const int N = 100010; 4 int p[N]; //儲存每個元素父節點是誰 5 int find(int x) { //返回x的祖宗節點,即返回x所在集合的編號 ,加上路徑壓縮優化 6 if (p[x] != x) { 7 p[x] = find(p[x]); 8 } 9 return p[x]; 10 } 11 int main() { 12 int n, m; 13 cin >> n >> m; 14 for (int i = 1; i <= n; i++) {
15 p[i] = i; 16 } 17 while (m--) { 18 string op; 19 int a, b; 20 cin >> op; 21 if (op == "M") { 22 cin >> a >> b; 23 p[find(a)] = find(b); 24 } else { 25 cin >> a >> b; 26 if
(find(a) == find(b)) { 27 cout << "Yes" << endl; 28 } else { 29 cout << "No" << endl; 30 } 31 } 32 } 33 return 0; 34 }