并查集的模板写法
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 }
以上是关于并查集的模板写法的主要内容,如果未能解决你的问题,请参考以下文章