版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第七讲并查集
(DisjointSet)导引问题 在某个城市里住着n个人,现在给定关于n个人的m条信息(即某2个人认识),
假设所有认识的人一定属于同一个单位,请计算该城市最多有多少单位?如何实现?什么是并查集?英文:DisjointSet,即“不相交集合”将编号分别为1…N的N个对象划分为不相交集合,在每个集合中,选择其中某个元素代表所在集合。常见两种操作:合并两个集合查找某元素属于哪个集合所以,也称为“并查集”实现方法(1)用编号最小的元素标记所在集合;定义一个数组set[1..n],其中set[i]表示元素i所在的集合;iSet(i)不相交集合:{1,3,7},{4},{2,5,9,10},{6,8}方法(1)——效率分析find1(x){returnset[x];}Merge1(a,b){i=min(a,b);j=max(a,b);for(k=1;k<=N;k++){if(set[k]==j)set[k]=i;}}Θ(1)Θ(N)有待改进?对于“合并操作”,必须搜索全部元素!树结构如何?实现方法(2)每个集合用一棵“有根树”表示定义数组set[1..n]set[i]=i,则i表示本集合,并是集合对应树的根set[i]=j,j<>i,则j是i的父节点.iSet(i法(2)——效率分析find2(x){r=x;while(set[r]!=r)r=set[r];returnr;}merge2(a,b){if(a<b)set[b]=a;elseset[a]=b;}Θ(1)最坏情况Θ(N)一般情况是…?困惑~~~性能有本质改进?如何避免最坏情况?避免最坏情况方法:将深度小的树合并到深度大的树实现:假设两棵树的深度分别为h1和h2,则合并后的树的高度h是:max(h1,h2),ifh1<>h2.h1+1,ifh1=h2.效果:任意顺序的合并操作以后,包含k个节点的树的最大高度不超过优化后算法及效率merge3(a,b){if(height(a)==height(b)){height(a)=height(a)+1;set[b]=a;}elseif(height(a)<height(b))set[a]=b;elseset[b]=a;}find2(x){r=x;while(set[r]!=r)r=set[r];returnr;}最坏情况Θ(logN)Θ(1)进一步优化——路径压缩思想:每次查找的时候,如果路径较长,则修改信息,以便下次查找的时候速度更快步骤:第一步,找到根结点第二步,修改查找路径上的所有节点,将它们都指向根结点带路径压缩的查找算法find3(x){r=x;while(set[r]<>r)//循环结束,则找到根节点r=set[r];i=x;while(i<>r)//本循环修改查找路径中所有节点{j=set[i];set[i]=r;i=j;}
}路径压缩示意图9108122021164611164111101298202116示例—畅通工程(HDOJ-1232)题目描述: 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?题目分析最赤裸裸的并查集,无话可说~附:参考源码(HDOJ-1232)#include"stdio.h"intbin[1002];intfindx(intx){intr=x;while(bin[r]!=r)r=bin[r];returnr;}voidmerge(intx,inty){intfx,fy;fx=findx(x);fy=findx(y);if(fx!=fy)bin[fx]=fy;}intmain(){intn,m,i,x,y,count;while(scanf("%d",&n),n){for(i=1;i<=n;i++)bin[i]=i;for(scanf("%d",&m);m>0;m--){scanf("%d%d",&x,&y);merge(x,y);}for(count=-1,i=1;i<=n;i++)if(bin[i]==i)count++;printf("%d\n",count);}}示例—小希的迷宫(HDOJ-1272)题目链接
下面的例子,前两个是符合条件的,但是最后一个却有两种方法从5到达8。
题目分析:该你们来说了~经典应用——最小生成树1、什么是——生成树?564231165346526556423115465a.带权图b.生成树经典应用——最小生成树2、什么是——最小生成树?5642311653465265a.带权图c.最小生成树56423115342经典应用——最小生成树3、如何求——最小生成树?A)Prim算法B)Kruskal算法理论基础:MST性质(证明…)经典应用——最小生成树4、Kruskal算法步骤:5642311653465265a.带权图一、把原始图的N个节点看成N个独立子图;二、每次选取当前最短的边(前提操作是?),看两端是否属于不同的子图;若是,加入;否则,放弃;三、循环操作该步骤二,直到有N-1条边;1经典应用——最小生成树5、算法过程示意:5642311653465265原始图5642316534652651经典应用——最小生成树5、算法过程示意:5642311653465265原始图5642316534652651经典应用——最小生成树5、算法过程示意:5642311653465265原始图5642316534652651经典应用——最小生成树5、算法过程示意:5642311653465265原始图5642316534652651经典应用——最小生成树5、算法过程示意:5642311653465265原始图5642316534652651经典应用——最小生成树5、算法过程示意:5642311653465265原始图5642316534
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《基因与宠物疾病》课件
- 2024排水沟施工合同
- 2024奶牛买卖合同范本范文
- 《SIYB游戏模块》课件
- 2024超市特许经营合同
- 湖北大学知行学院《油画创作》2022-2023学年第一学期期末试卷
- 湖北大学知行学院《金融风险管理》2021-2022学年第一学期期末试卷
- 开展水痘健康教育
- 中华人民共和国国际海运条例培训2024
- 2024山林防护管理承包合同
- 医学课件抗痉挛体位摆放
- 2024年统编版七年级上册道德与法治 第三单元 珍爱我们的生命 第八课 生命可贵 第2课时 敬畏生命 教学课件
- IATF16949组织环境因素识别表
- 《积极心理学(第3版)》 课件 第11章 宽容、篇终 积极心理学的应用与展望
- 2024-2025学年七年级数学上册第一学期 期末模拟测试卷(湘教版)
- 职业素质养成(吉林交通职业技术学院)智慧树知到答案2024年吉林交通职业技术学院
- 5.5《方程的意义》(课件)-2024-2025学年人教版数学五年级上册
- 2024年秋人教版七年级上册数学全册教学课件(新教材)
- 运用PDCA管理方法,推进三甲复审工作课件
- 【新教材】苏科版(2024)七年级上册数学第1-6章全册教案设计
- 物业公司安全生产管理制度和操作规程
评论
0/150
提交评论