并查集
2016-07-20 17:24
197 查看
初始时n个元素分属不同的n个集合,通过不断的给出元素间的联系,要求实时的统计元素间的关系(直接或间接的联系),可用并查集加以判断。 (1)元素间是否有联系:判断两个元素是否属于同一个集合;(查) (2)建立元素间的联系:只需合并两个元素各自所属的集合。(并) 并查集本身不具有结构,必须借助一定的数据结构 实现。一般用的比较多的是数组、链表和树来实现。
实现方法1:
用编号最小的元素标记所在集合;定义一个数组 set[1..n] ,其中set[i] 表示元素i 所在的集合;
find1(x) { return set[x]; } Merge1(a,b) { i = min(a,b); j = max(a,b); for (k=1; k<=N; k++) { if (set[k] == j) set[k] = i; } }
实现方法2:
每个集合用一棵“有根树”表示定义数组 father[1..n],father[i] = i , 则i表示本集合,且是集合对应树的根father[i] = j, j<>i, 则 j 是 i 的父节点. 用某个元素所在树的根结点表示该元素所在的集合,判断两个元素时候属于同一个集合的时候,只需要判断他们所在树的根结点是否一样即可 这样,当我们合并两个集合的时候,也只需在两个根结点之间连边即可 避免最坏情况: 方法:将深度小的树合并到深度大的树实现
int findx(int x) { int r=x; while(p[r] !=r) r=p[r]; return r; } void merge(int x, int y) { int fx,fy; fx = findx(x); fy = findx(y); if(fx != fy) p[fx] = fy; }
相关文章推荐
- STL之resize()函数
- Java多线程(二) 多线程的锁机制
- AngularJS $on $broadcast $emit
- IO引脚复用和映射
- 浅谈C++多态性
- 【BZOJ】1087【SCOI2005】互不侵犯King
- 《leetcode》: LRU Cache
- Fragment在inflate时的注意事项
- Mysql cluster集群的搭建
- 4-1 单链表逆转 (20分)
- 2016multi-university1005 KM算法
- win7下64bit,运行libsvm2.90中setup.py时出现unable to find vcvarsall.bat 的解决方法
- python 笔记
- UML 类图
- 图片转换为字节流,字节流转换为图片
- 折线分割平面 hd 2050
- BlockingQueue
- 基本UDP套接字编程
- 数据类型所佔用内存大小
- Java实现 二叉搜索树算法(BST)