ZH奶酪:【数据结构与算法】并查集基础
1、介绍
并查集是一种树型数据结构,用于处理一些不相交集合的合并问题。
并查集主要操作有:
(1)合并两个不相交集合;
(2)判断两个元素是否属于同一个集合;
(3)路径压缩;
2、常用操作
用father[i]表示元素i的父亲结点,例如:

用某个元素所在树的根节点表示该元素所在集合;
判断两个元素是否属于同一个集合的时候,只需要判断他们所在树的根节点是否一样即可;
也就是说,当我们合并两个集合的时候,只需要在两个根节点之间连边即可。
获取根节点代码:
int findFather(int x){
if(father[x] == x)
return x;
else
return findFather(father[x]);
}
判断是否属于同一集合代码:
bool judge(int x,int y){
int fx,fy;
fx = findFather(x);
fy = findFather(y);
return fx==fy;
}
合并不同元素到同一集合代码:
void unionSet(int x,int y){
x = findFather(x);
y = findFather(y);
father[x] = y;
}
3、优化1——路径压缩
思想
每次查找的时候,如果路径较长,则修改信息,以便下次查找的时候速度更快;
步骤
(1)找到根节点;
(2)修改查找路径上的所有结点,将他们都指向根节点;
例如查找下面并查集中的“20”,“9,10,20”均在查找路径上,则进行路径压缩

带路径压缩的查找算法代码
int findFather(int x){
int r = x;
//get the root of x
while(father[r] != r)
r = father[r];
int i=x;
//update the nodes in searching path
while(i != r){
j = father[i];
father[i] = r;
i = j;
}
return r;
}
4、优化2-合并
思想
两个集合合并,也就是2棵树合并,为了降低合并后的树的深度,一般采取将深度小的树的树根作为深度大的树的树根的孩子节点。
策略
增加辅助空间记录树的深度。
合并代码:
void unionSet(int x,int y){
x = findFather(x);
y = findFather(y);
if(x == y)
return ;
if(rank[x] > rank[y]){
father[y] = x;
}else{
if(rank[x] == rank[y])
rank[y]++;
father[x] = y;
}
}
5、并查集例题
5.1、HDOJ1232(畅通工程)
http://www.cnblogs.com/CheeseZH/archive/2012/05/13/2498073.html
5.2、HDOJ1272(小希的迷宫)
http://www.cnblogs.com/CheeseZH/archive/2012/05/25/2518639.html
6、并查集练习题
(1)银河英雄传说(NOI2002)
(2)食物链(NOI2001)
(3)Parity(ceoi99)
ZH奶酪:【数据结构与算法】并查集基础的更多相关文章
- 模板——最小生成树kruskal算法+并查集数据结构
并查集:找祖先并更新,注意路径压缩,不然会时间复杂度巨大导致出错/超时 合并:(我的祖先是的你的祖先的父亲) 找父亲:(初始化祖先是自己的,自己就是祖先) 查询:(我们是不是同一祖先) 路径压缩:(每 ...
- 最小生成树(Minimum Spanning Tree)——Prim算法与Kruskal算法+并查集
最小生成树——Minimum Spanning Tree,是图论中比较重要的模型,通常用于解决实际生活中的路径代价最小一类的问题.我们首先用通俗的语言解释它的定义: 对于有n个节点的有权无向连通图,寻 ...
- 数据结构和算法(Golang实现)(10)基础知识-算法复杂度主方法
算法复杂度主方法 有时候,我们要评估一个算法的复杂度,但是算法被分散为几个递归的子问题,这样评估起来很难,有一个数学公式可以很快地评估出来. 一.复杂度主方法 主方法,也可以叫主定理.对于那些用分治法 ...
- 数据结构和算法(Golang实现)(9)基础知识-算法复杂度及渐进符号
算法复杂度及渐进符号 一.算法复杂度 首先每个程序运行过程中,都要占用一定的计算机资源,比如内存,磁盘等,这些是空间,计算过程中需要判断,循环执行某些逻辑,周而反复,这些是时间. 那么一个算法有多好, ...
- 近期公共祖先(LCA)——离线Tarjan算法+并查集优化
一. 离线Tarjan算法 LCA问题(lowest common ancestors):在一个有根树T中.两个节点和 e&sig=3136f1d5fcf75709d9ac882bd8cfe0 ...
- BZOJ 2342: [Shoi2011]双倍回文 马拉车算法/并查集
2342: [Shoi2011]双倍回文 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1123 Solved: 408 题目连接 http://w ...
- POJ1861 Network (Kruskal算法 +并查集)
Network Description Andrew is working as system administrator and is planning to establish a new net ...
- [学习笔记]可持久化数据结构——数组、并查集、平衡树、Trie树
可持久化:支持查询历史版本和在历史版本上修改 可持久化数组 主席树做即可. [模板]可持久化数组(可持久化线段树/平衡树) 可持久化并查集 可持久化并查集 主席树做即可. 要按秩合并.(路径压缩每次建 ...
- 【HDU1232】畅通工程(并查集基础题)
裸敲并查集,很水一次AC #include <iostream> #include <cstring> #include <cstdlib> #include &l ...
随机推荐
- bzoj 2150 最小路径覆盖
最小路径覆盖问题是:给定一个DAG,该DAG的一个路径覆盖是一个路径的集合,使得每个点属于且仅属于其中一条路径,问题就是求一个大小最小的路径集合. 做法是将每个点A拆成两个点A1,A2,如果A-> ...
- 深入理解RESTful Web Services
RESTful的软件架构已经多火不用多说,和MVC架构一样,很多网站服务(Web Services)都遵循RESTful设计模式,那么到底什么是RESTful Web Services呢?设计一个RE ...
- SQL 列转行,即多行合并成一条
需求:按照分组,将多条记录内容合并成一条,效果如下: 数据库示例: CREATE TABLE [t2]([NID] [bigint] NULL,[district] [nvarchar](255) N ...
- 给Android组件添加事件一个很好用的方法
在这里想和大家分享一下很好用的添加事件方法,特别是在处理ListView里的Item事件的时候,很方便. 首先,在XML里布局的时候,添加这样一个属性: android:onClick="C ...
- Python脚本报错AttributeError: 'module' object has no attribute 'maketrans'
出现此错误的原因:是此文件smtp02.py 所在的目录下有string.pyc 的文件存在,与python库里的string.pyc冲突造成无法确认编译所取的类库.
- 解决sdk manager下载非常慢或者下载失败
有了sdk manager,打开它,想下载一些须要的东西总是会发现非常慢,然后就仅仅好慢慢等待,等待许久之后最后是失败了,这样就会非常麻烦,以下我总结总结,怎样解决这些问题,让你在分分钟下载好这些东西 ...
- windows下androidNDK环境配置
一:什么是NDK? NDK 提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so 和java 应用一起打包成apk.这些工具对开发者的帮助是巨大的. NDK 集成了交叉编译器, ...
- easyDarwin--开源流媒体实现
EasyDarwin 是由国内开源流媒体团队开发和维护的一款开源流媒体平台框架,从2012年12月创建并发展至今,从原有的单服务的流媒体服务器形式,扩展成现在的云平台架构的开源项目,更好地帮助广大流媒 ...
- [部署Mantis]用Administrator注册新用户时设置密码
伤不起的Mantis邮箱配置,在新的Mantis配置里面默认通过接收激活邮件来设定密码. 如果你Mantis邮箱配置OK的话一切OK,遇到我这样死活配不成功,网络上大神们众说纷纭,一一参照,无奈死伤无 ...
- Android平台上优秀的开源项目
软件名:gaeproxy 软件作用:Android手机配置GoAgent. 项目地址:https://github.com/madeye/gaeproxy.git 软件名:ProxyDroid 软件作 ...