数据结构---并查集
并查集,顾名思义,合并 查找 集合;
并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。常常在使用中以森林来表示。
对于概念等等的这里不再赘述,直接讲解应用。
应用1:判断图中有多少联通分量 , 或者图是否联通(联通分量 == 1) HDU 1213
应用2:判断图是否成环 给个例题 HDU2120
【初始化】 MakeSet,将每一个节点的父节点置为本身;rank(秩),是节点构成树的深度
void MakeSet(){for(int i=1;i<=maxn;i++){parent[i].value = i;parent[i].rank=0;}
}
【查找】 一直向上查找,直到找到当前节点的代表,或者说当前节点所在树的根
ps:路径压缩,由于查找耗时与树的深度有关,, 所以我们经过一次查找,都把节点所在树 压缩,使之扁平化,这样树的深度就大大减小了。
int Findroot(int x){ //路径压缩 int root=x; while(root!=parent[root].value){ //找到根节点root=parent[root].value; } while(x!=root){ int tmp = parent[x].value; //将该节点的父节点, 以及父节点的父节点等等, 全部指向根节点。parent[x].value = root; x=tmp; } return root;
}
【合并】
因为从上面的查找可以看出,查找的效率主要影响因素是树的深度,也就是秩,所以我们在合并两颗树的时候,把秩较小的接在 秩较大的树的根节点上
这样,树的秩就不会加深,如果 两棵树的秩相等,那么深度也只会加1;
void Union(int x,int y){ //按 秩(深度) 合并 , 将秩较小的 接到秩较大的树的根节点上int xroot = Find(x);int yroot = Find(y);if(xroot == yroot) return;if(parent[xroot].rank < parent[yroot].rank)parent[xroot].value = yroot;else if(parent[xroot].rank > parent[yroot].rank)parent[yroot].value = xroot;else{parent[yroot].value = xroot; //如果秩相同, 深度会加 1 ; parent[xroot].rank++;}
}
转载于:https://www.cnblogs.com/chaiwenjun000/p/5320985.html
数据结构---并查集相关推荐
- 高级数据结构---并查集
高级数据结构-并查集 原理:参考趣学数据结构 代码: #include<stdio.h> #include<stdlib.h> #define N 100 int father ...
- (转载)一种简单而有趣的数据结构——并查集
一种简单而有趣的数据结构--并查集 作者:goal00001111(高粱) 一个秘密生物武器落到某地区,导致当地村民丧失部分记忆,只认得自己最熟悉的人,而忘记自己是哪个村子的人了.大家汇集到一个广场, ...
- 一种简单而有趣的数据结构——并查集
一种简单而有趣的数据结构--并查集 作者:goal00001111(高粱) 一个秘密生物武器落到某地区,导致当地村民丧失部分记忆,只认得自己最熟悉的人,而忘记自己是哪个村子的人了.大家汇集到一个广场, ...
- 算法与数据结构——并查集
文章推荐:[算法与数据结构]-- 并查集 例子: 数据结构--最小生成树之克鲁斯卡尔算法(Kruskal) 1.2 并查集思想(重点) 我们可以把每个连通分量看成一个集合,该集合包含了连通分量的所有点 ...
- 【常用数据结构——并查集(又在乱牵线了)】
并查集 简介 并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中.这一类问题 ...
- 【总结】C++ 高级数据结构 —— 并查集用法详解
文章目录 一.并查集的介绍 二.并查集的基本操作 一.并查集的介绍 并查集(union_find sets)是一种维护集合的数据结构,它的名字中"并""查"&q ...
- 第三十一篇 玩转数据结构——并查集(Union Find)
1.. 并查集的应用场景 查看"网络"中节点的连接状态,这里的网络是广义上的网络 数学中的集合类的实现 2.. 并查集所支持的操作 对于一组数据,并查集主要支持两种操作:合并两个数 ...
- 并查集与贪心算法的应用之求解无向图的最小生成树
一,介绍 本文介绍使用Kruskal算法求解无向图的最小生成树.Kruskal是一个贪心算法,并且使用了并查集这种数据结构. 关于并查集的介绍,参考:数据结构--并查集的原理及实现 二,构造一个无向图 ...
- LeetCode 2092. 找出知晓秘密的所有专家(并查集)
文章目录 1. 题目 2. 解题 1. 题目 给你一个整数 n ,表示有 n 个专家从 0 到 n - 1 编号. 另外给你一个下标从 0 开始的二维整数数组 meetings ,其中 meeting ...
最新文章
- java删除jtable一行的值_JTable中删除一行数据
- flutter 刷脸_GitHub - nnnggel/baidu_face_plugin: 百度人脸识别和活体检测 Flutter 插件(目前版本仅支持 Android)...
- 赠书:《Java性能优化实践》,众多业内大佬推荐阅读
- 【Python项目实战】提取.docx文件中的图片并保存到指定的文件夹
- goLand工程结构管理
- 今日arXiv精选 | 近期必读的5篇Transformers相关论文
- zoj3195 联通树上三个点的路径长
- 攻击linux的samba,Samba 中间人攻击漏洞(CVE-2015-5296)
- spring基础——外部引入属性文件创建bean
- Spring MVC学习总结(20)——SpringMVC传参总结
- C++面向对象高级编程(上) 第一周 侯捷
- 如何在ASP.NET程序中使用报表查看器控件并传递用户凭据
- python语言适用于哪些领域_Python用于哪些领域
- 企业微信好不好,OA软件何去何从?
- 将html转换为string格式
- SDIO读写SD卡速度有多快?
- OP-TEE基本的从芯片设计到给客户的安全问题浅析
- Deep Face Recognition论文翻译
- NCCL、OpenMPI、Gloo对比
- ubuntu 编译 找不到 -ly
热门文章
- 【H2 Database】安装
- java读取对象失败_jsp exception对象获取异常信息
- 调试一个c语言程序要经过,c语言程序调试
- linux内存和缓冲区,linux – 内存消失了(不,不是缓冲区或缓存)
- java多数据源事务管理_Spring中实现多数据源事务管理 - CSDN博客
- hpux oracle9,oracle 9i,10G,11G,各版本下载资源
- java守护锁_Java 对象锁-synchronized()与线程的状态与生命周期与守护进程
- 浮点数用大小端存储吗_干细胞存储有什么用,干细胞有必要存储吗
- java高并发(二十一)高并发场景下缓存常见问题
- python中可选参数的特征_sklearn特征选择方法及参数