欢迎来到天天文库
浏览记录
ID:15714960
大小:231.00 KB
页数:9页
时间:2018-08-05
《实验最小生成树算法的设计与实现(报告)》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、实验5最小生成树算法的设计与实现一、实验目的1、根据算法设计需要,掌握连通图的灵活表示方法;2、掌握最小生成树算法,如Prim、Kruskal算法;3、基本掌握贪心算法的一般设计方法;4、进一步掌握集合的表示与操作算法的应用。二、实验内容1、认真阅读算法设计教材和数据结构教材内容,熟习连通图的不同表示方法和最小生成树算法;2、设计Kruskal算法实验程序。有n个城市可以用(n-1)条路将它们连通,求最小总路程的和。设计测试问题,修改并调试程序,输出最小生成树的各条边,直至正确为止。三、Kruskal算法的原理方法边权排序:1314623641452353452561263565661
2、.初始化时:属于最小生成树的顶点U={}不属于最小生成树的顶点V={1,2,3,4,5,6}2.根据边权排序,选出还没有连接并且权最小的边(131),属于最小生成树的顶点U={1,3},不属于最小生成树的顶点V={2,4,5,6}3.根据边权排序,选出还没有连接并且权最小的边(462),属于最小生成树的顶点U={{1,3},{4,6}}(还没有合在一起,有两颗子树),不属于最小生成树的顶点V={2,5}4.根据边权排序,选出还没有连接并且权最小的边(364),属于最小生成树的顶点U={1,3,4,6}(合在一起),不属于最小生成树的顶点V={2,5}5.根据边权排序,选出还没有连接并且
3、权最小的边(364),属于最小生成树的顶点U={1,2,3,4,6},,不属于最小生成树的顶点V={5}6.根据边权排序,选出还没有连接并且权最小的边(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);//对边按边权进行升序排序
4、详细代码:#include#include#include#include#defineMAXN_E100000#defineMAXN_V100000usingnamespacestd;structEdge{intfm,to,dist;//边的起始顶点,边的到达顶点,边权}e[MAXN_E];intfa[MAXN_V],n,m;//顶点数组,顶点总数,边总数//定义比较,只是边权比较boolcmp(Edgea,Edgeb){returna.dist5、//getfa是在并查集森林中找到x的祖先if(fa[x]==x)returnfa[x];elsereturnfa[x]=getfa(fa[x]);}//判断祖先是否是同一个,即是否联通intsame(intx,inty){returngetfa(x)==getfa(y);}//合并两棵树voidmerge(intx,inty){intfax=getfa(x),fay=getfa(y);fa[fax]=fay;}intmain(){inti;cout<<"请输入顶点数目和边数目:"<>n>>m;//n为点数,m为边数//输出顶点信息cout<<"各个顶点值依次为:"6、<>e[i].fm>>e[i].to>>e[i].dist;//用边集数组存放边,方便排序和调用sort(e+1,e+m+1,cmp);//对边按边权进行升序排序intrst=n,ans=0;//rst表示目前的点共存在于多少个集合中,初始情况是每个点都在不同的集合中for(i=1;i<=m&&rst>1;i++){intx=e7、[i].fm,y=e[i].to;if(same(x,y))continue;//same函数是查询两个点是否在同一集合中else{merge(x,y);//merge函数用来将两个点合并到同一集合中rst--;//每次将两个不同集合中的点合并,都将使rst值减1ans+=e[i].dist;//这条边是最小生成树中的边,将答案加上边权}}cout<
5、//getfa是在并查集森林中找到x的祖先if(fa[x]==x)returnfa[x];elsereturnfa[x]=getfa(fa[x]);}//判断祖先是否是同一个,即是否联通intsame(intx,inty){returngetfa(x)==getfa(y);}//合并两棵树voidmerge(intx,inty){intfax=getfa(x),fay=getfa(y);fa[fax]=fay;}intmain(){inti;cout<<"请输入顶点数目和边数目:"<>n>>m;//n为点数,m为边数//输出顶点信息cout<<"各个顶点值依次为:"
6、<>e[i].fm>>e[i].to>>e[i].dist;//用边集数组存放边,方便排序和调用sort(e+1,e+m+1,cmp);//对边按边权进行升序排序intrst=n,ans=0;//rst表示目前的点共存在于多少个集合中,初始情况是每个点都在不同的集合中for(i=1;i<=m&&rst>1;i++){intx=e
7、[i].fm,y=e[i].to;if(same(x,y))continue;//same函数是查询两个点是否在同一集合中else{merge(x,y);//merge函数用来将两个点合并到同一集合中rst--;//每次将两个不同集合中的点合并,都将使rst值减1ans+=e[i].dist;//这条边是最小生成树中的边,将答案加上边权}}cout<
此文档下载收益归作者所有