并查集的模板写法

Posted oldataraxi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并查集的模板写法相关的知识,希望对你有一定的参考价值。

 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 }

以上是关于并查集的模板写法的主要内容,如果未能解决你的问题,请参考以下文章

并查集模板

笔记并查集---无向图处理代码模板及类型题

模板并查集 两种路径压缩写法

并查集模板

并查集模板

并查集-poj2524