并查集
来源:互联网 发布:nexus7跳过网络验证 编辑:程序博客网 时间:2024/06/06 19:07
并查集:(union-find sets)
一种简单的用途广泛的集合.并查集是若干个不相交集合,能够实现较快的合并和判断元素所在集合的操作,应用很多,如其求无向图的连通分量个数等。最完美的应用当属:实现Kruskar算法求最小生成树。
主要操作:
合并两个不相交集合操作很简单:先设置一个数组Father[x],表示x的“父亲”的编号。那么,合并两个不相交集合的方法就是,找到其中一个集合最父亲的父亲(也就是最久远的祖先),将另外一个集合的最久远的祖先的父亲指向它。
判断两个元素是否属于同一集合仍然使用上面的数组。则本操作即可转换为寻找两个元素的最久远祖先是否相同。可以采用递归实现。
并查集的优化
路径压缩
刚才我们说过,寻找祖先时采用递归,但是一旦元素一多起来,或退化成一条链,每次GetFather都将会使用O(n)的复杂度,这显然不是我们想要的。
对此,我们必须要进行路径压缩,即我们找到最久远的祖先时“顺便”把它的子孙直接连接到它上面。这就是路径压缩了。
Rank合并
C语言代码:合并时将元素所在深度低的集合合并到元素所在深度深的集合。<以上摘自网络>
#include <iostream>using namespace std;int f[n]; // 记录节点n的父节点int find(int x){ if(f[x]==x) // 根节点的父节点是其本身,找到的时候就可以返回了 return x; //返回根节点 else f[x]=find(f[x]); //运用回朔返回的根节点为f[x]重新赋值。 return f[x];}int merger(int x,int y) //合并操作{ f[x]=y; //把集合x的父节点设置为y. 完成x集合与Y集合的合并。 // PS:x是X集合的根节点,y是Y集合的根节点。合并不能随便选取节点,必须要根节点; }
- HDU3938 并查集 并查集
- 并查集(集并查)
- HDU1232 并查集<并>
- 并查集
- 数据结构-并查集
- 并查集
- 并查集!
- 并查集
- 并查集
- 并查集
- 并查集
- 并查集总结
- 并查集学习
- 并查集
- 并查集
- 并查集
- 所谓并查集
- 并查集
- php有现成的函数getimagesize用于获取图像的尺寸
- java--IO流
- Webi-数字,日期格式
- HR 开发技术(abap 转载)
- 用SpringTest测试时发生的NoSuchMethodError并解决
- 并查集
- 计算机方面自学网站
- 有状态bean和无状态bean是在说什么
- poj acm 1050 最大子矩阵
- hdu 2222 Keywords Search AC自动机
- 专题笔记--Java 类集框架
- 网站可用性设计中 不容忽略的30个基础原则
- SmartUpload
- 看了这部动画片的C++