当前位置: 首页 > news >正文

ZH奶酪:【数据结构与算法】并查集基础

1、介绍

并查集是一种树型数据结构,用于处理一些不相交集合的合并问题。

并查集主要操作有:

  (1)合并两个不相交集合;

  (2)判断两个元素是否属于同一个集合;

  (3)路径压缩;

2、常用操作

用father[i]表示元素i的父亲结点,例如:

用某个元素所在树的根节点表示该元素所在集合;

判断两个元素是否属于同一个集合的时候,只需要判断他们所在树的根节点是否一样即可;

也就是说,当我们合并两个集合的时候,只需要在两个根节点之间连边即可。

获取根节点代码:

1 int findFather(int x){
2     if(father[x] == x)
3         return x;
4     else
5         return findFather(father[x]);
6 }

判断是否属于同一集合代码:

1 bool judge(int x,int y){
2     int fx,fy;
3     fx = findFather(x);
4     fy = findFather(y);
5     return fx==fy;
6 }

 

合并不同元素到同一集合代码:

1 void unionSet(int x,int y){
2     x = findFather(x);
3     y = findFather(y);
4     father[x] = y;
5 }

 

3、优化1——路径压缩

思想

每次查找的时候,如果路径较长,则修改信息,以便下次查找的时候速度更快;

步骤

(1)找到根节点;

(2)修改查找路径上的所有结点,将他们都指向根节点;

例如查找下面并查集中的“20”,“9,10,20”均在查找路径上,则进行路径压缩

带路径压缩的查找算法代码

 1 int findFather(int x){
 2     int r = x;
 3     //get the root of x
 4     while(father[r] != r)
 5         r = father[r];
 6     int i=x;
 7     //update the nodes in searching path
 8     while(i != r){
 9         j = father[i];
10         father[i] = r;
11         i = j;
12     }
13     return r;
14 }

4、优化2-合并

思想

两个集合合并,也就是2棵树合并,为了降低合并后的树的深度,一般采取将深度小的树的树根作为深度大的树的树根的孩子节点。

策略

增加辅助空间记录树的深度。

合并代码:

 1 void unionSet(int x,int y){
 2     x = findFather(x);
 3     y = findFather(y);
 4     if(x == y)
 5         return ;
 6     if(rank[x] > rank[y]){
 7         father[y] = x;
 8     }else{
 9         if(rank[x] == rank[y])
10             rank[y]++;
11         father[x] = y;
12     }
13 }

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)

 

相关文章:

  • lnmp 在nginx中配置相应的错误页面error_page
  • Android 官方命令深入分析之Android Debug Bridge(adb)
  • 使用cardme读写VCard文件,实现批量导入导出电话簿
  • 使用SQL Server 2008远程链接时SQL数据库不成功的解决方法
  • 做基准测试时tpcc相关注意点
  • 分享一个 ftp下载、解压、更新依赖库文件的 python 脚本
  • wifi的web 认证。
  • Servlet开篇
  • Linode Centos6.5从零开始装环境...流水账
  • 在Linux系统中如何识别U盘
  • sql语句中in与exist not in与not exist 的区别
  • android 关于 android sdk manager 更新,下载慢的问题
  • (笔试题)合法字符串
  • 【重磅】大众点评运维架构图文详解 @马哥教育联合创始人张冠宇
  • linux总结
  • 230. Kth Smallest Element in a BST
  • Create React App 使用
  • FastReport在线报表设计器工作原理
  • HTTP 简介
  • JS实现简单的MVC模式开发小游戏
  • JS数组方法汇总
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • nfs客户端进程变D,延伸linux的lock
  • vuex 学习笔记 01
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 阿里云应用高可用服务公测发布
  • 闭包--闭包之tab栏切换(四)
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 聊聊sentinel的DegradeSlot
  • 前端面试题总结
  • 日剧·日综资源集合(建议收藏)
  • 使用 @font-face
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • $.proxy和$.extend
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (多级缓存)缓存同步
  • (二)JAVA使用POI操作excel
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (简单) HDU 2612 Find a way,BFS。
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (十)T检验-第一部分
  • (译)2019年前端性能优化清单 — 下篇
  • (转)EOS中账户、钱包和密钥的关系
  • (转)甲方乙方——赵民谈找工作
  • (转载)Linux 多线程条件变量同步
  • (状压dp)uva 10817 Headmaster's Headache
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .net core 6 集成和使用 mongodb
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .NET框架设计—常被忽视的C#设计技巧