分离集合

在有的问题中,需要对不相交的集合(disjoint set)进行这样两种操
  作:
  • 检索某元素属于哪个集合
  • 合并两个集合
此时,我们可以使用并查集维护这两个操作。

      并查集的森林实现


• 一般来说我们用森林的结构实现并查集
• 在森林中,每棵树代表一个集合。
• 对每个元素,记录它在森林中的父亲f[i]
  • 对于根节点而言有f[i]=i,表示它是这个集合的代表元。


• 合并操作:两个集合S1、 S2合并,将其中的一个树根作为另一
  个树根的子树即可。
• 查找操作:对于一个元素u的查找,顺着u往上找,直到线索到
  根节点,也就确定了u所在的集合。

 

      两个优化


• 启发式合并:
    在合并集合S1、 S2的时候,我们让较小的树成为较大的树的
  子树。这里可以是深度、节点个数等启发函数来比较树的大小。


• 路径压缩:
    我们在查找完u至根节点的路径之后,一般将这条路径上的
  所有节点的父节点都设为根节点,这样可以大大减少之后的查找
  次数。

 

      并查集的时间复杂度


• 可以证明,经过启发式合并和路径压缩之后的并查集,执行m次
  查找的复杂度为O(mα(m))


• 其中α(m)是Asizekermann函数的某个反函数,你可以近似的认为
  它是小于5的。所以并查集的单次查找操作的时间复杂度也几乎
  是常数级的。

 

EG:

银河英雄传说(NOI2002)

可爱的猴子(POI2003)

      带边权无向图最小连通代价

给出一个每条边带有权值的无向图。

我们可以删除图里面的一些边,从而使得图当中最大的边的边权
  尽量小,但是我们需要保证点1和点N仍然是连通的。

      带边权无向图最小连通代价


• 对于“最小的最大”或者“最大的最小”这一类字眼,我们经常会用
  到二分答案的方法。


• 对于这一题,我们可以尝试二分最大边权的最小值,然后我们只
  加入比这个值小的边,然后通过BFS(或DFS)去检查点1和点N是
  不是连通的。

 

EG:

noip2013 货车运输


如果你不开心,那我就把右边这个帅傻子分享给你吧,你看,他这么好看,跟个zz一样看着你,你还伤心吗?真的!这照片盯上他五秒钟就想笑了。一切都会过去的。时间时间会给你答案2333

转载于:https://www.cnblogs.com/Mary-Sue/p/9338219.html

图论学习四之Disjoint set union并查集相关推荐

  1. 数据结构与算法A实验六图论---7-8判断是否有路径(并查集)

    给定一个有N个顶点和E条边的无向图,请判断给定的两个顶点之间是否有路径存在. 假设顶点从0到N−1编号. 输入格式: 输入第1行给出2个整数N(0<N≤10)和E,分别是图的顶点数和边数. 随后 ...

  2. 图论(最短路,最小生成树,并查集)

    本文目录: tarjan算法(判断环) 最小生成树(Kruskal算法) 最小生成树(Prim算法) 优先队列实现dijkstra(最短路) 并查集(求环) floyd(弗洛伊德) (最短路) 判断环 ...

  3. 【并查集】Union Find

    并查集 引出并查集 并查集(Union Find) 如何存储数据? 接口定义 元素的初始化 UnionFind.java Quick Find union 示例及实现 find 实现 Quick Fi ...

  4. 并查集(disjoint set)的实现及应用

    这里有一篇十分精彩.生动的 并查集详解 (转): "朋友的朋友就是朋友"⇒ 传递性,建立连通关系 disjoint set,并查集(一种集合),也叫不相交集,同时也是一种树型的数据 ...

  5. PyTorch框架学习四——计算图与动态图机制

    PyTorch框架学习四--计算图与动态图机制 一.计算图 二.动态图与静态图 三.torch.autograd 1.torch.autograd.backward() 2.torch.autogra ...

  6. C#多线程学习(四) 多线程的自动管理(线程池) (转载系列)——继续搜索引擎研究...

    在多线程的程序中,经常会出现两种情况: 一种情况:   应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应                   这一般使用ThreadPo ...

  7. C++用并查集Disjoint union实现connected component连通分量(附完整源码)

    C++用并查集Disjoint union实现connected component连通分量 C++用并查集Disjoint union实现connected component连通分量完整源码(定义 ...

  8. python学习四(处理数据)

    python学习四(处理数据) head first python中的一个数据处理的例子 有四个U10选手的600米成绩,请取出每个选手跑的最快的3个时间.以下是四位选手的9次成绩 James 2-3 ...

  9. Docker学习四:Docker 网络

    前言 本次学习来自于datawhale组队学习: 教程地址为: https://github.com/datawhalechina/team-learning-program/tree/master/ ...

最新文章

  1. windows系统下Python环境的搭建
  2. wxWidgets:wxComboCtrl类用法
  3. 分布式面试 - 分布式锁的常见问题
  4. android打包成apk会屏蔽注解,Android解决混淆打包之后注解被去掉的问题-Go语言中文社区...
  5. python round保留小数位_Python-其他-round()保留小数位时遇到的问题
  6. 使用遇到的问题_使用三防整理剂做织物整理会遇到这些问题...
  7. php rgb转cmyk,php – 使用Imagick将图像从RGB转换为CMYK
  8. 轻松了解python正则表达式 (超详细,附举例)
  9. Virtualbox虚拟机安装win10系统卡顿
  10. 港中深、华为联合培养,韩晓光课题组招收三维视觉数字人方向博士生
  11. 数据库和网页之间的数据交互
  12. 深度解读物联网区块链“IOTA”:不仅解决IoT痛点,还解决区块链痛点
  13. PHP变量说法不正常是,关于PHP变量的说法中正确的是(? ?)。
  14. 全网最全面的python的讲解,讲的无可挑剔《记得收藏》
  15. SSM框架的介绍与搭建
  16. 解决蓝牙耳机连接win10电脑,声音 卡顿,断断续续问题,索尼wf-1000xm3
  17. SQL Server 2005的100范例程序及数据库下载
  18. 如何修改notepad默认编码
  19. ie 8无法安装因为您的计算机上,ie8无法安装解决方法介绍
  20. 查看一个归档或压缩文件的内容而无需解压它

热门文章

  1. USACO3.22Stringsobits
  2. Oracle 11g Release 1 (11.1) Oracle 本文索引的四种类型
  3. 深度学习中Attention机制的“前世今生”
  4. 合成视频以假乱真新高度!商汤科技、中科院、南洋理工大学联合提出当前最高清的语音驱动视频生成系统...
  5. 信号扫描_微观世界扫描电子显微镜(SEM)
  6. Python描述符是什么?
  7. 全栈工程师对Python面试中is和==的区别做出解释!看完真的学到了
  8. python基础—字典
  9. Python入门方法--简单总结+学习方式思考
  10. FreeAnchor:令anchor自由匹配标签的策略