并查集,顾名思义,合并 查找 集合;

并查集是一种树型的数据结构,用于处理一些不相交集合(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

数据结构---并查集相关推荐

  1. 高级数据结构---并查集

    高级数据结构-并查集 原理:参考趣学数据结构 代码: #include<stdio.h> #include<stdlib.h> #define N 100 int father ...

  2. (转载)一种简单而有趣的数据结构——并查集

    一种简单而有趣的数据结构--并查集 作者:goal00001111(高粱) 一个秘密生物武器落到某地区,导致当地村民丧失部分记忆,只认得自己最熟悉的人,而忘记自己是哪个村子的人了.大家汇集到一个广场, ...

  3. 一种简单而有趣的数据结构——并查集

    一种简单而有趣的数据结构--并查集 作者:goal00001111(高粱) 一个秘密生物武器落到某地区,导致当地村民丧失部分记忆,只认得自己最熟悉的人,而忘记自己是哪个村子的人了.大家汇集到一个广场, ...

  4. 算法与数据结构——并查集

    文章推荐:[算法与数据结构]-- 并查集 例子: 数据结构--最小生成树之克鲁斯卡尔算法(Kruskal) 1.2 并查集思想(重点) 我们可以把每个连通分量看成一个集合,该集合包含了连通分量的所有点 ...

  5. 【常用数据结构——并查集(又在乱牵线了)】

    并查集 简介 并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中.这一类问题 ...

  6. 【总结】C++ 高级数据结构 —— 并查集用法详解

    文章目录 一.并查集的介绍 二.并查集的基本操作 一.并查集的介绍 并查集(union_find sets)是一种维护集合的数据结构,它的名字中"并""查"&q ...

  7. 第三十一篇 玩转数据结构——并查集(Union Find)

    1.. 并查集的应用场景 查看"网络"中节点的连接状态,这里的网络是广义上的网络 数学中的集合类的实现 2.. 并查集所支持的操作 对于一组数据,并查集主要支持两种操作:合并两个数 ...

  8. 并查集与贪心算法的应用之求解无向图的最小生成树

    一,介绍 本文介绍使用Kruskal算法求解无向图的最小生成树.Kruskal是一个贪心算法,并且使用了并查集这种数据结构. 关于并查集的介绍,参考:数据结构--并查集的原理及实现 二,构造一个无向图 ...

  9. LeetCode 2092. 找出知晓秘密的所有专家(并查集)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个整数 n ,表示有 n 个专家从 0 到 n - 1 编号. 另外给你一个下标从 0 开始的二维整数数组 meetings ,其中 meeting ...

最新文章

  1. java删除jtable一行的值_JTable中删除一行数据
  2. flutter 刷脸_GitHub - nnnggel/baidu_face_plugin: 百度人脸识别和活体检测 Flutter 插件(目前版本仅支持 Android)...
  3. 赠书:《Java性能优化实践》,众多业内大佬推荐阅读
  4. 【Python项目实战】提取.docx文件中的图片并保存到指定的文件夹
  5. goLand工程结构管理
  6. 今日arXiv精选 | 近期必读的5篇Transformers相关论文
  7. zoj3195 联通树上三个点的路径长
  8. 攻击linux的samba,Samba 中间人攻击漏洞(CVE-2015-5296)
  9. spring基础——外部引入属性文件创建bean
  10. Spring MVC学习总结(20)——SpringMVC传参总结
  11. C++面向对象高级编程(上) 第一周 侯捷
  12. 如何在ASP.NET程序中使用报表查看器控件并传递用户凭据
  13. python语言适用于哪些领域_Python用于哪些领域
  14. 企业微信好不好,OA软件何去何从?
  15. 将html转换为string格式
  16. SDIO读写SD卡速度有多快?
  17. OP-TEE基本的从芯片设计到给客户的安全问题浅析
  18. Deep Face Recognition论文翻译
  19. NCCL、OpenMPI、Gloo对比
  20. ubuntu 编译 找不到 -ly

热门文章

  1. 【H2 Database】安装
  2. java读取对象失败_jsp exception对象获取异常信息
  3. 调试一个c语言程序要经过,c语言程序调试
  4. linux内存和缓冲区,linux – 内存消失了(不,不是缓冲区或缓存)
  5. java多数据源事务管理_Spring中实现多数据源事务管理 - CSDN博客
  6. hpux oracle9,oracle 9i,10G,11G,各版本下载资源
  7. java守护锁_Java 对象锁-synchronized()与线程的状态与生命周期与守护进程
  8. 浮点数用大小端存储吗_干细胞存储有什么用,干细胞有必要存储吗
  9. java高并发(二十一)高并发场景下缓存常见问题
  10. python中可选参数的特征_sklearn特征选择方法及参数