并查集模板
来源:互联网 发布:mac find 查找文件夹 编辑:程序博客网 时间:2024/05/25 16:40
#include <stdio.h>/*有的写法用到了树的深度,就是重新开一个数组ran[maxn];用来记录每个树的深度,合并的时候把深度较小的合并到较大的上边,防止出现最极端的情况。但是用上路径压缩的话就不需要这个数组,因为压缩过后深度都是 2 ,随意操作;压缩就是把/* *//*里面的 par[x] = 加上,不加上去的话只查找,没有压缩;附上带ran[]数组的合并;如果用ran[]数组,尽量不要用rank[] rank再后边学习的时候是一个关键字; */void unite(){ int fa = find(a); int fb = find(b); if (fa == fb) return ; if (ran[fa] < ran[fb]) //如果a树的深度小于b树 就把a树忘b树上合并; par[fa] = fb; else { par[fb] = fa; if (ran[fa] == ran[fb]) ran[fa]++; }}const int maxn = 1e6 + 10;int par[maxn];void init(int n){ for (int i = 0; i <= n; i++) par[i] = i;}//压缩和不压缩的都要知道,后边有时会处理不压缩的; int find(int x){法1. if ( x!= par[x]) return /* */find(par[x]); return x;法2. return x == par[x] ? x : /* */find(par[x]);法3. int p = x, q = x; while (x != par[x]) x = par[x];//这三种都是朴素的查找,适合数据量不大的情况 /* while (par[q] != x) { int j = par[q]; par[q] = x; q = j; }这一种采取路径压缩的方法查找元素 ,防止溢栈 */ return par[x]; }void unite(int a, int b){ int fa = find(a); int fb = find(b); if (fa != fb) par[fa] = fb;}int main(){ return 0;}
阅读全文
0 0
- 并查集模板
- 并查集模板
- 并查集模板
- 并查集模板
- 【模板】并查集
- 并查集模板
- 并查集模板
- 并查集模板
- 并查集模板
- 并查集【模板】
- 并查集 模板
- 并查集模板
- 并查集模板
- 并查集模板
- 并查集模板
- 并查集模板
- 并查集 模板
- 并查集模板
- CC2640R2F BLE5.0 应用程序框架
- HDU6027(快速幂)(水)
- zoj 1203
- 直接插入排序与希尔排序
- java 反射机制
- 并查集模板
- IDEA使用--字体、编码和JDK Maven等基本设置
- RPC 服务框架 Dubbo 将正式得到官方维护与支持
- android Fragment中没有onTouchEvent解决方法
- 服务端指南 | 良好的 API 设计指南
- keras 设置学习率的办法
- postgres 设置主键自增
- 服务器字体的设置
- .Net 反编译