


版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验5最小生成树算法的设计与实现一、实验目的1、根据算法设计需要,掌握连通图的灵活表示方法;2、掌握最小生成树算法,如Prim、Kruskal算法;3、基本掌握贪心算法的一般设计方法;4、进一步掌握集合的表示与操作算法的应用。二、实验内容1、认真阅读算法设计教材和数据结构教材内容,熟习连通图的不同表示方法和最小生成树算法;2、设计Kruskal算法实验程序。有n个城市可以用(n-1)条路将它们连通,求最小总路程的和。设计测试问题,修改并调试程序,输出最小生成树的各条边,直至正确为止。三、Kruskal算法的原理方法边权排序:4 316236445354556265661.初始化时:届丁最小生成
2、树的顶点U=不届丁最小生成树的顶点V=1,2,3,4,5,62.根据边权排序,选出还没有连接并且权最小的边(131),届丁最小生成树的顶点U=1,3,不届丁最小生成树的顶点V=2,4,5,6根据边权排序,选出还没有连接并且权最小的边(462),届丁最小生成树的顶点U=1,3,4,6(还没有合在一起,有两颗子树),不届丁最4.根据边权排序,选出还没有连接并且权最小的边(364),届丁最小生成树的顶点U=1,3,4,6(合在一起),不届丁最小生成树的顶点V=2,55.根据边权排序,选出还没有连接并且权最小的边(364),届丁最小生成树的顶点U=1,2,3,4,6,不届丁最小生成树的顶点V=56.根
3、据边权排序,选出还没有连接并且权最小的边(364),届丁最小生成树的顶点U=1,2,3,4,5,6此时,最小生成树已完成四、实验程序的功能模块功能模块:boolcmp(Edgea,Edgeb);定义比较方法intgetfa(intx);在并查集森林中找到x的祖先intsame(intx,inty);判断祖先是否是同一个,即是否联通voidmerge(intx,inty);合并子树,即联通两子树sort(e+1,e+m+1,cmp);对边按边权进行升序排序详细代码:#include<iostream>#include<cstdio>#include<cstring&
4、gt;#include<algorithm>#defineMAXN_E100000#defineMAXN_V100000usingnamespacestd;structEdgeintfm,to,dist;边的起始顶点,边的到达顶点,边权eMAXN_E;intfaMAXN_V,n,m;顶点数组,顶点总数,边总数定义比较,只是边权比较boolcmp(Edgea,Edgeb)returna.dist<b.dist;查找x的祖先intgetfa(intx)/getfa是在并查集森林中找到x的祖先if(fax=x)returnfax;elsereturnfax=getfa(fax);判
5、断祖先是否是同一个,即是否联通intsame(intx,inty)returngetfa(x)=getfa(y);合并两棵树voidmerge(intx,inty)intfax=getfa(x),fay=getfa(y);fafax=fay;intmain()inti;cout<<”请输入顶点数目和边数目:"<<endl;cin>>n>>m;/n为点数,m为边数输出顶点信息cout<<"各个顶点值依次为:"<<endl;for(i=0;i<n;i+)fai=i;if(i!=0)II.co
6、ut<<fai<<cout<<endl;cout<<"请输入边的信息(例子:145从顶点1到顶点4的边权为5)"<<endl;for(i=1;i<=m;i+)cin>>ei.fm>>ei.to>>ei.dist;/用边集数组存放边,方便排序和调用sort(e+1,e+m+1,cmp);对边按边权进行升序排序intrst=n,ans=0;/rst表示目前的点共存在丁多少个集合中,初始情况是每个点都在不同的集合中for(i=1;i<=m&&rst>1
7、;i+)intx=ei.fm,y=ei.to;if(same(x,y)continue;/sameiS数是查询两个点是否在同一集合中elsemerge(x,y);/mergea§数用来将两个点合并到同一集合中rst-;/每次将两个不同集合中的点合并,都将使rst值减1ans+=ei.dist;/这条边是最小生成树中的边,将答案加上边权cout<<ans;return0;五、测试数据和相应的最小生成树Input:3 1026rT0法设计与分折疫检5DMugkg3心N134535564556646266Putout:18生成树为:*一+七、思考题1、微软面试题一个大院子里住了
8、50户人家,每家都养了一条狗,有一天他们接到通知说院子里有狗生病了,并要求所有主人在发现自己家狗生病的当天就要把狗枪杀掉。然而所有主人和他们的狗都不能够离开自己的房子,主人与主人之间也不能通过任何方式进行沟通,他们能做的只是通过窗户观察别人家的狗是否生病从而判断自己的狗病否。(就是说,每个主人只能看出其他49家的狗是不是生病,单独看自己的狗是看不出来的)第一天没有枪声,第二天还是没有枪声,第三天传出一阵枪声,问有多少条狗被枪杀。答:3只假如只有一只病狗,那么当该病狗主人第一天发现其他49家都是好狗时就会判断出自己家狗是病狗,那么第一天就会有枪声。假如有两只病狗A和B,那么当两只狗主人对望时,看到了对方家里是病狗,那么他们也不会判断出自己家狗狗是否生病,当然第一天第二天第三天以及以后都不会有枪声。假如有三只病狗A和B和C,那么其他47个主人都会看到3只病狗,而他们三家却互相看到两只病狗,第一天没有枪声是因为ABC三家都看到了其他的病狗,没有判断初自己家狗是否生病,第二天没有枪声则验证了A确定BC两家和他一样也发现了两只病狗,同理
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中国内蒙古园林绿化行业发展监测及投资战略研究报告
- 华洪新材2025年财务分析详细报告
- 2025年中国儿童饼干行业发展前景预测及投资方向研究报告
- 中国小程序市场竞争策略及行业投资潜力预测报告
- 2025年 物业管理师三级考试练习试题附答案
- 中国双机容错软件行业竞争格局及市场发展潜力预测报告
- 2025年 陇南徽县消防救援大队招聘政府专职消防员考试试题附答案
- 济南低压配电柜项目可行性研究报告范文参考
- 粘着剂行业深度研究分析报告(2024-2030版)
- 2025年 高级养老护理员职业技能考试练习题附答案
- 产时子痫应急演练文档
- 操作规程储气罐安全操作规程
- 开标一览表(格式)
- 初一数学(下)难题百道及答案
- 七年级下实数及实数的计算
- 中国古典文献学(全套)
- 一起学习《数字中国建设整体布局规划》
- 两用物项-最终用户用途证明
- 以案释纪心得体会
- GB/T 28728-2012溶液聚合苯乙烯-丁二烯橡胶(SSBR)微观结构的测定
- GB/T 15474-2010核电厂安全重要仪表和控制功能分类
评论
0/150
提交评论