下载此文档

acm 优先队列 并查集 最小生成树.ppt


文档分类:IT计算机 | 页数:约29页 举报非法文档有奖
1/29
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/29 下载此文档
文档列表 文档介绍
?,能够实现较快的合并和判断元素所在集合的操作,应用很多,如其求无向图的连通分量个数等。最完美的应用当属:实现Kruskar算法求最小生成树。(union-findsets)最重要的两个操作就是合并和查找。并查集的精髓并查集的精髓(即它的三种操作,结合实现代码模板进行理解):1、Make_Set(x)把每一个元素初始化为一个集合初始化后每一个元素的父亲节点是它本身,每一个元素的祖先节点也是它本身(也可以根据情况而变)。2、Find_Set(x)查找一个元素所在的集合查找一个元素所在的集合,其精髓是找到这个元素所在集合的祖先!这个才是并查集判断和合并的最终依据。判断两个元素是否属于同一集合,只要看他们所在集合的祖先是否相同即可。合并两个集合,也是使一个集合的祖先成为另一个集合的祖先,具体见示意图并查集的精髓3、Union(x,y)合并x,y所在的两个集合合并两个不相交集合操作很简单:利用Find_Set找到其中两个集合的祖先,将一个集合的祖先指向另一个集合的祖先。如图并查集的优化1、Find_Set(x)时路径压缩寻找祖先时我们一般采用递归查找,但是当元素很多亦或是整棵树变为一条链时,每次Find_Set(x)都是O(n)的复杂度,有没有办法减小这个复杂度呢?答案是肯定的,这就是路径压缩,即当我们经过"递推"找到祖先节点后,"回溯"的时候顺便将它的子孙节点都直接指向祖先,这样以后再次Find_Set(x)时复杂度就变成O(1)了,如下图所示;可见,路径压缩方便了以后的查找。压缩路径(查)/*查找x元素所在的集合,回溯时压缩路径*/intFind_Set(intx){if(x!=father[x]){father[x]=Find_Set(father[x]);//这个回溯时的压缩路径是精华}returnfather[x];}并查集的优化2、Union(x,y)时按秩合并即合并的时候将高度小的集合合并到高度大的集合中,这样合并之后树的高度会相对较小。按秩合并voidUnion(intx,inty){x=Find_Set(x);y=Find_Set(y);if(x==y)return;if(rank[x]>rank[y])father[y]=x;else{if(rank[x]==rank[y])rank[y]++;father[x]=y;}}相关习题:POJ1611TheSuspects最基础的并查集POJ2524UbiquitousReligions最基本的并查集POJ1182食物链并查集的拓展POJ2492ABug'work并查集+自定义排序+贪心求"最小生成树"POJ1703Findthem,

acm 优先队列 并查集 最小生成树 来自淘豆网m.daumloan.com转载请标明出处.

非法内容举报中心
文档信息
  • 页数29
  • 收藏数0 收藏
  • 顶次数0
  • 上传人ogthpsa
  • 文件大小337 KB
  • 时间2020-07-11