并查集(Union-Find-Set)简洁而高效地处理连通分量的查询与合并

并查集由一个整型数组和两个函数构成

1.数组pre[]:记录每个结点的前导结点(父节点),初始化为:pre[i]=i

2.函数unionset:合并两个连通分量

3.函数findset:查找任意两个点是否在同一个连通分量

可以把每个连通分量看成一个集合,该集合中包含了连通分量中的所有点。

这些点两两连通,而具体的连通方式无关紧要,就好比集合中的元素没有先后顺序之分,只有属于和不属于的区别

在图中,每个点恰好属于一个连通分量,对应到集合表示中,每个元素恰好属于一个集合。

换句话说,图的所有连通分量可以用若干个不相交集合来表示

并查集的精妙之处在于用树来表示集合。例如,若包含点1,2,3,4,5,6的图有3个连通分量{1,3},{2,5,6},{4},

则需要用3棵树来表示。这三棵树的具体形态无关紧要,只要有一棵树包含1,3两个点,一棵树包含2,5,6三个点,

还有一棵树包含4这个点即可。规定每棵树的根节点是这棵树所对应的集合的代表元。

并查集中的路径压缩,在特殊情况下,这棵树可能是一条长链。设链的最后一个节点是x,则每次执行find(x)都会遍历整条链,

效率十分低下,改进方法其实很简单。既然每棵树表示的只是一个集合,因此树的形态是无关精要的,并不需要在查找操作之后保持树的形态不变,只要顺便把遍历过的节点都改成树根的子节点,下次查找就会快很多

int pre[maxn];//pre[i]记录i的前驱节点
int findset(int x)//查找x的根节点
{if(pre[x]==x)    return x;return pre[x]=findset(pre[x]);
}
//合并x和y所在的连通分量
void unionset(int x,int y)
{int fx=findset(x),fy=findset(y);pre[fy]=fx;
}

并查集(Union-Find-Set)简洁而高效地处理连通分量的查询与合并相关推荐

  1. 数据结构与算法(十二)并查集(Union Find)及时间复杂度分析

    本文主要包括以下内容: 并查集的概念 并查集的操作 并查集的实现和优化 Quick Find Quick Union 基于size的优化 基于rank的优化 路径压缩优化 并查集的时间复杂度 并查集的 ...

  2. 数据结构-PHP 并查集(Union Find)

    文章目录 数据结构-PHP 并查集(Union Find) 1.并查集示意图 2.并查集合并 3.并查集简单的代码示例 3.1 PHP代码定义 3.2 输出演示 数据结构-PHP 并查集(Union ...

  3. 关于 并查集(union find) 算法基本原理 以及 其 在分布式图场景的应用

    二月的最后一篇水文-想写一些有意思的东西. 文章目录 环检测在图数据结构中的应用 深度/广度优先 检测环 并查集数据结构 (Union-Find) 基本概念 初始化 合并 union 查找祖先 优化1 ...

  4. 擒贼先擒王——并查集

    写一篇并查集的总文,详细介绍什么是并查集?思想是怎样的?怎么写出代码?如何对应题目? 1.什么是并查集 并查集被很多OIer认为是最简洁而优雅的数据结构之一,主要用于解决一些元素分组的问题.它管理一系 ...

  5. 【LeetCode】﹝并查集ி﹞连通分量个数(套用模板一直爽)

    [LeetCode]﹝并查集ி﹞连通分量个数(套用模板一直爽) 文章目录 [LeetCode]﹝并查集ி﹞连通分量个数(套用模板一直爽) 模板(使用路径压缩的加权quick-union算法) 连通网络 ...

  6. 每日一题——众里寻花(并查集)

    学习目标: 每天睡前是否感到浑浑噩噩,一天又在不知不觉中过去,回想我今天都干了什么呢? 啊~我这一天又什么也没干,好有罪恶感啊,不行,我明天一定要好好学算法(手动狗头). 明日复明日,明日何其多?不要 ...

  7. Kruskal算法与并查集

    Kruskal算法与并查集 一.Kruskal算法 1. 概念 Kruskal算法就是按照图中各个边上的权值大小进行递增排序,以此来构造最小生成树. 2.重点解析 在由Kruskal实现最小生成树的过 ...

  8. 基于C语言,详解Kruskal算法(利用并查集)实现构建最小生成树

    目录 一.Kruskal算法的基本介绍 具体做法:找出森林中连接任意两棵树的所有边中,具有最小权值的边,如果将它加入生成树中不产生回路,则它就是生成树中的一条边.这里的关键就是如何判断"将它 ...

  9. 并查集leetcode经典逆序思维

    题目 有一个 m x n 的二元网格,其中 1 表示砖块,0 表示空白.砖块 稳定(不会掉落)的前提是: 一块砖直接连接到网格的顶部,或者 至少有一块相邻(4 个方向之一)砖块 稳定 不会掉落时 给你 ...

最新文章

  1. 前端小哥玩HTML复选框上瘾,能画logo做视频,还开源成JS库
  2. linux 内核抓包功能实现基础(二) netfilter处理
  3. 情感分析(Sentiment Analysis)的难题--转
  4. android保持数据库,android – 保持Firebase实时数据库中的数据始终保持同步
  5. ecs服务器内网连接_让不同地域云服务器ECS和云数据库内网互通
  6. 2019ICPC(徐州) - Who is better?(中国剩余定理+斐波那契博弈)
  7. python gridsearch_python gridsearch中的内存错误
  8. listview 点击条目 自动置顶或者自动置底部
  9. 软件开发人员的简历项目经验怎么写
  10. github 从0开始的基本操作到fork和pr项目
  11. FPGA 等效门数的计算方法
  12. android 微信图片动画,一款仿微信图片加载,微博图片加载,视频加载时的进度view...
  13. 记录阿里云虚拟主机FTP连接不上的解决办法
  14. 利用PS调整图片文件的色彩饱和度
  15. 记录:google map谷歌地图自定义叠加层overlay流程
  16. 亲完如何进行下一步_吻过女孩后,下一步怎么办?
  17. Mac显示/隐藏文件夹
  18. (操作系统开发)从实模式---->保护模式---->IA-32e模式( 64位模式)
  19. 大数据知识点归纳总结
  20. 三种办法,轻松计算马德里商标费用

热门文章

  1. hibernate缓存机制
  2. 0728pm 控制器
  3. IOS-关闭(退)键盘事件--转
  4. 如何用堆栈和循环结构代替递归调用--递归转换为非递归的10条军规
  5. 让Vs2013 完美支持EF6.1 Code First with Oracle 2015年12月24日更新
  6. JAVA学习之常用集合List,Set,Map
  7. 《锋利的jQuery》学习---基础篇01(持续更新)
  8. hibernate.hbm.xml详解
  9. 自定义验证控件CustomValidator
  10. struts2漏洞监测_CVE20190233: S2060 拒绝服务漏洞分析