并查集详解(模板)
来源:互联网 发布:大数据支撑平台 编辑:程序博客网 时间:2024/06/13 21:42
并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。这一类问题近几年来反复出现在信息学的国际国内赛题中,其特点是看似并不复杂,但数据量极大,若用正常的数据结构来描述的话,往往在空间上过大,计算机无法承受;即使在空间上勉强通过,运行的时间复杂度也极高,根本就不可能在比赛规定的运行时间(1~3秒)内计算出试题需要的结果,只能用并查集来描述。
主要操作:
初始化
把每个点所在集合初始化为其自身。
通常来说,这个步骤在每次使用该数据结构时只需要执行一次,无论何种实现方式,时间复杂度均为O(N)。
查找
查找元素所在的集合,即根节点。
合并
将两个元素所在的集合合并为一个集合。
通常来说,合并之前,应先判断两个元素是否属于同一集合,这可用上面的“查找”操作实现。
看下图就就是将左边变成右边存
主要的两个函数code:
int pre[1000 ]; int find(int x) //查找根节点 { int r=x; while ( pre[r ] != r ) //返回根节点 r r=pre[r ]; int i=x , j ; while( i != r ) //路径压缩 { j = pre[ i ]; // 在改变上级之前用临时变量 j 记录下他的值 pre[ i ]= r ; //把上级改为根节点 i=j; } return r ; } void join(int x,int y) //判断x y是否连通, //如果已经连通,就不用管了 //如果不连通,就把它们所在的连通分支合并起, { int fx=find(x),fy=find(y); if(fx!=fy) pre[fx ]=fy; }再提供一个简单的递归code;
int Find(int x){ if(x==pre[x]) return x; else return pre[x]=Find(pre[x]);}void fun(int x,int y){ int fx=Find(x),fy=Find(y); if(fx!=fy) pre[fy]=fx;}
大家可以用这道题练练手加深理解 畅通工程
阅读全文
2 0
- 并查集详解(模板)
- 并查集详解+模板
- 并查集(模板)
- 并查集(模板)
- 并查集模板
- 并查集模板
- 并查集模板
- 并查集模板
- 【模板】并查集
- 并查集模板
- 并查集模板
- 并查集模板
- 并查集模板
- 并查集【模板】
- 并查集 模板
- 并查集模板
- 并查集模板
- 并查集模板
- HDU 3605 Escape(最大流+状态压缩)
- poj1273(最大流)
- 2017.08.15【NOIP 普及组】模拟赛C组 猴子拆房
- QT信号槽传递参数技巧
- C语言中的static 详细分析
- 并查集详解(模板)
- 【NOIP2016-D1T3】换教室
- poj-2395-Out of Hay-(Kruskal)
- [POJ](1789)Truck History ---最小生成树(图)
- 算法题练习系列之(二十七): 有理数四则运算
- Mybatis 初识
- 回调函数,函数指针
- 不受控制的 position-fixed
- 存储过程的例子(三)