实验5最小生成树算法设计与实现(报告).doc

上传人:壹****1 文档编号:557974285 上传时间:2023-09-27 格式:DOC 页数:9 大小:27.50KB
返回 下载 相关 举报
实验5最小生成树算法设计与实现(报告).doc_第1页
第1页 / 共9页
实验5最小生成树算法设计与实现(报告).doc_第2页
第2页 / 共9页
实验5最小生成树算法设计与实现(报告).doc_第3页
第3页 / 共9页
实验5最小生成树算法设计与实现(报告).doc_第4页
第4页 / 共9页
实验5最小生成树算法设计与实现(报告).doc_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《实验5最小生成树算法设计与实现(报告).doc》由会员分享,可在线阅读,更多相关《实验5最小生成树算法设计与实现(报告).doc(9页珍藏版)》请在金锄头文库上搜索。

1、(完整word版)实验5最小生成树算法的设计与实现(报告)实验5最小生成树算法的设计与实现一、实验目的1、根据算法设计需要,掌握连通图的灵活表示方法;2、掌握最小生成树算法,如Prim、Kruskal算法;3、基本掌握贪心算法的一般设计方法;4、进一步掌握集合的表示与操作算法的应用。二、实验内容1、认真阅读算法设计教材和数据结构教材内容,熟习连通图的不同表示方法和最小生成树算法;2、设计Kruskal算法实验程序。有n个城市可以用(n-1)条路将它们连通,求最小总路程的和。设计测试问题,修改并调试程序,输出最小生成树的各条边,直至正确为止。三、Kruskal算法的原理方法边权排序:131462

2、3641452353452561263565661.初始化时:属于最小生成树的顶点U=/不属于最小生成树的顶点V=1,2,3,4,5,62. 根据边权排序,选出还没有连接并且权最小的边(131),属于最小生成树的顶点U=1,3,不属于最小生成树的顶点V=2,4,5,63. 根据边权排序,选出还没有连接并且权最小的边(462),属于最小生成树的顶点U=1,3,4,6(还没有合在一起,有两颗子树),不属于最小生成树的顶点V=2,54. 根据边权排序,选出还没有连接并且权最小的边(364),属于最小生成树的顶点U=1,3,4,6(合在一起),不属于最小生成树的顶点V=2,55. 根据边权排序,选出还

3、没有连接并且权最小的边(364),属于最小生成树的顶点U=1,2,3,4,6,,不属于最小生成树的顶点V=56.根据边权排序,选出还没有连接并且权最小的边(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);/对边按边权进行升序排序详细代码:#inc

4、lude#include#include#include#defineMAXN_E100000#defineMAXN_V100000usingnamespacestd;structEdgeintfm,to,dist;/边的起始顶点,边的到达顶点,边权eMAXN_E;intfaMAXN_V,n,m;/顶点数组,顶点总数,边总数/定义比较,只是边权比较boolcmp(Edgea,Edgeb)returna.distb.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请输入顶点数目和边数目:nm;/n为点数,m为边数/输出顶点信息cout各个顶点值依次为:endl;for(i=0;in;i+)fai=i;if(i!=0)coutfai;coutendl;cout请输入边的信息(例子:145从顶点1到顶点4的边权为5)endl;for(i=1;iei.fmei.toei.dist;

6、/用边集数组存放边,方便排序和调用sort(e+1,e+m+1,cmp);/对边按边权进行升序排序intrst=n,ans=0;/rst表示目前的点共存在于多少个集合中,初始情况是每个点都在不同的集合中for(i=1;i1;i+)intx=ei.fm,y=ei.to;if(same(x,y)continue;/same函数是查询两个点是否在同一集合中elsemerge(x,y);/merge函数用来将两个点合并到同一集合中rst-;/每次将两个不同集合中的点合并,都将使rst值减1ans+=ei.dist;/这条边是最小生成树中的边,将答案加上边权coutans;return0;五、测试数据和

7、相应的最小生成树Input:6 101 261 311 452 352 563 453 56364462566Putout:18生成树为:七、思考题1、微软面试题一个大院子里住了50户人家,每家都养了一条狗,有一天他们接到通知说院子里有狗生病了,并要求所有主人在发现自己家狗生病的当天就要把狗枪杀掉。然而所有主人和他们的狗都不能够离开自己的房子,主人与主人之间也不能通过任何方式进行沟通,他们能做的只是通过窗户观察别人家的狗是否生病从而判断自己的狗病否。(就是说,每个主人只能看出其他49家的狗是不是生病,单独看自己的狗是看不出来的)第一天没有枪声,第二天还是没有枪声,第三天传出一阵枪声,问有多少条

8、狗被枪杀。答:3只假如只有一只病狗,那么当该病狗主人第一天发现其他49家都是好狗时就会判断出自己家狗是病狗,那么第一天就会有枪声。假如有两只病狗A和B,那么当两只狗主人对望时,看到了对方家里是病狗,那么他们也不会判断出自己家狗狗是否生病,当然第一天第二天第三天以及以后都不会有枪声。假如有三只病狗A和B和C,那么其他47个主人都会看到3只病狗,而他们三家却互相看到两只病狗,第一天没有枪声是因为ABC三家都看到了其他的病狗,没有判断初自己家狗是否生病,第二天没有枪声则验证了A确定BC两家和他一样也发现了两只病狗,同理BC也是。那么第三天ABC就会判断出自己家的狗是病狗了。提示:上面的大字2、针对连通图初始边集最小堆表示,设计Kruskal算法。详情请看文件实验五:最小堆Kruskal.cpp

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号