1 并查集:
2 #include<utility>
3 #include<iostream>
4 #include<set>
5 #include<map>
6 #include<vector>
7 #include<queue>
8 #include<cmath>
9 #include<algorithm>
10 const int MAX_E = 10001;
11 const int MAX_N = 10000;
12 const int INF = 999999;
13 using namespace std;
14 //先搞并查集:
15 int fa[MAX_N];
16 int Rank[MAX_N];
17 //一共n个元素
18 //初始化大小为n的并查集
19 void init(int n) {
20 for (int i = 0; i < n; i++) {
21 fa[i] = i;
22 }
23 }
24 //查询树的根
25 int find(int x) {
26 //这是使用了路径压缩的写法
27 return x == fa[x] ? x : fa[x] = find(fa[x]);
28 //如果不用路径压缩的话:
29 //return x == fa[x] ? x : find(fa[x]);
30 }
31 //合并x与y所在的集合
32 void unite(int x, int y) {
33 //先找祖宗
34 x = find(x);
35 y = find(y);
36 if (x == y)return;//如果本来就一组,就什么都不用干了
37 if (Rank[x] < Rank[y]) {
38 fa[x] = y;
39 }
40 else {
41 fa[y] = x;
42 if (Rank[x] == Rank[y])Rank[x]++;//如果一颗高一棵矮,最后的高度一定是原来高的那棵树的高度.如果两颗一样高,高度会变成原高度+1
43 }
44 }
45 //判断x与y是否属于同一集合
46 bool same(int x, int y) {
47 return find(x) == find(y);
48 }