并查集
来源:互联网 发布:淘宝手机浏览任务软件 编辑:程序博客网 时间:2024/06/06 17:10
并查集是一种树型的数据结构,用于处理一些不相交集合的合并问题
并查集的主要操作有:
1-合并两个不相交集合
2-判断两个元素是否属于同一个集合
3-路径压缩
并查集的两种优化方法:路径压缩与按秩合并。
- int pre[N],rank[N]; //pre[]为前驱,rank[]为当前元素所在集合的大小
- //初始化
- void Init()
- {
- for(int i=0; i<N; i++)
- {
- pre[i] = i;
- rank[i] = 1;
- }
- }
- //带路径压缩的非递归找根节点
- int Find(int x)
- {
- int r = x;
- while(r != pre[r])
- r = pre[r];
- int i = x, j;
- while(i != r)
- {
- j = pre[i];
- pre[i] = r;
- i = j;
- }
- return r;
- }
- //带路径压缩的递归找根节点
- int Find(int x)
- {
- if(pre[x] != x)
- pre[x] = Find(pre[x]);
- return pre[x];
- }
- //按秩合并,元素少的集合的根节点指向元素多的集合的根节点
- void Union(int x,int y)
- {
- x = Find(x);
- y = Find(y);
- if(x == y) return;
- if(rank[x] >= rank[y])
- {
- pre[y] = x;
- rank[x] += rank[y];
- }
- else
- {
- pre[x] = y;
- rank[y] += rank[x];
- }
- }
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1856
题意:给m个集合,求元素最多的那个集合的元素个数。
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1272
题意:给定点集,判断形成它们形成的图是否无环且连通。
分析:先把所有的点的父亲节点指向自己,然后用并查集合并,每次把合并的两个点标记为访问过的,如果中间出现要合并的两个节点的根节点都相同,说明有环,如果最后在访问过的节点中有大于1个节点的父亲节点还是自己,说明不连通。
题目:http://acm.nefu.edu.cn/JudgeOnline/problemshow.php?problem_id=212
题意:求一个元素所在的集合的所有元素的个数。
分析:直接合并即可。
0 0
- HDU3938 并查集 并查集
- 并查集(集并查)
- HDU1232 并查集<并>
- 并查集
- 数据结构-并查集
- 并查集
- 并查集!
- 并查集
- 并查集
- 并查集
- 并查集
- 并查集总结
- 并查集学习
- 并查集
- 并查集
- 并查集
- 所谓并查集
- 并查集
- UNIX时间戳的应用
- IOS-正确删除系统框架
- Word任务怎样在ABBYY FineReader12中自定义
- jmeter如何获取10位时间戳
- 【cocos2d-x 报错异常集】error LNK2019: 无法解析的外部符号
- 并查集
- 技术宅,改变世界!
- Android广播机制
- C 野指针
- Python uuid模块
- CSS 魔法系列:纯 CSS 绘制三角形(各种角度)
- PHP 对数组进行压缩编码, 哪种最好?(php几种压缩方式的对比)
- [leetcode-96]Unique Binary Search Trees(c++)
- 解决c/c++的sequence points和side effects问题