最小生成树Kruskal算法

上传人:mar****e5 文档编号:204327026 上传时间:2023-04-26 格式:DOCX 页数:32 大小:263.23KB
收藏 版权申诉 举报 下载
最小生成树Kruskal算法_第1页
第1页 / 共32页
最小生成树Kruskal算法_第2页
第2页 / 共32页
最小生成树Kruskal算法_第3页
第3页 / 共32页
资源描述:

《最小生成树Kruskal算法》由会员分享,可在线阅读,更多相关《最小生成树Kruskal算法(32页珍藏版)》请在装配图网上搜索。

1、课程设计报告课程设计名称:数据结构课程设计 课程设计题目:最小生成树 Kruskal 算法院(系) 专业 班级 学号 姓名 指导教师目录1 课程设计介绍 11.1课程设计容 11.2课程设计要求 12 课程设计原理 22.1课设题目粗略分析 22.2原理图介绍 42.2.1 功能模块图 42.2.2 流程图分析 53 数据结构分析 113.1存储结构 113.2算法描述 114 调试与分析 134.1调试过程 134.2 程序执行过程 13参考文献 16附 录(关键部分程序清单) 171 课程设计介绍1.1课程设计容编写算法能够建立带权图,并能够用Kruskal算法求该图的 最小生成树。最小生

2、成树能够选择图上的任意一点做根结点。最小 生成树输出采用顶点集合和边的集合的形式。1.2课程设计要求1. 顶点信息用字符串,数据可自行设定。2. 参考相应的资料,独立完成课程设计任务。3. 交规课程设计报告和软件代码。2 课程设计原理2.1 课设题目粗略分析根据课设题目要求,拟将整体程序分为三大模块。以下是三个模 块的大体分析:1. 要确定图的存储形式,通过对题目要求的具体分析。发现该题 的主要操作是路径的输出,因此采用边集数组(每个元素是一个结构 体,包括起点、终点和权值)和邻接矩阵比较方便以后的编程。2. Kruskal算法。该算法设置了集合A,该集合一直是某最小生 成树的子集。在每步决定

3、是否把边(u,v)添加到集合A中,其添加条 件是AU (u,v) 仍然是最小生成树的子集。我们称这样的边为A的 安全边,因为可以安全地把它添加到 A 中而不会破坏上述条件。3. Dijkstra 算法。算法的基本思路是:假设每个点都有一对标号 (d ,p ),其中 d 是从起源点到点 j 的最短路径的长度(从顶点到其本jj身的最短路径是零路(没有弧的路),其长度等于零);p则是从s到jj 的最短路径中 j 点的前一点。求解从起源点 s 到点 j 的最短路径算 法的基本过程如下:1)初始化。起源点设置为:d=0,p为空;所有其它点:d =s si,p = ?;标记起源点s,记k=s,其他所有点设

4、为未标记的。i2)k 到其直接连接的未标记的点 j 的距离,并设置:d =mind , d+lj j k kj式中,l是从点k到j的直接连接距离。kj3)选取下一个点。从所有未标记的结点中,选取d中最小的一个i:jd =mind ,所有未标记的点j ij点i就被选为最短路径中的一点,并设为已标记的。4)找到点i的前一点。从已标记的点中找到直接连接到i的点j*,作为前一点,设置:i=j*5)标记点i。如果所有点已标记,则算法完全推出,否则,记k=i,转到2)再继续。而程序中求两点间最短路径算法。其主要步骤是: 调用dijkstra算法。 将path中的第“终点”元素向上回溯至起点,并显示出来。2

5、.2 原理图介绍2.2.1 功能模块图图 2.1 功能模块图2.2.2 流程图分析1. 主函数输入顶点个数 输入边数e 输入选项an调用 insertsort, kruskal 函数输入v0 调用 dijkstra, printpathl 函数 输入v0,v1 调用 dijkstra, printpath2 函数输入a=4图 2.2 主函数流程图2. insertsort 函数3. Kruskal 函数图2.4 Kruskal函数流程图4. dijkstra 函数prinbpabhl 因讐N2 6 pzrintpathl 鈕讐鶴6. printpath2 函数int k; k=vl; whil

6、e(k!=vO) printf(%dv-,k);k=pathk;图2.7 printpath2函数流程图3 数据结构分析3.1存储结构 定义一个结构体数组,其空间足够大,可将输入的字符串存于数组中。 struct edgesint bv;int tv;int w;3.2算法描述1. Kruskal 函数:因为Kruskal需要一个有序的边集数组,所以要先对边集数组 排序。其次,在执行中需要判断是否构成回路,因此还需另有一个判 断函数seeks,在Kruskal中调用seeks。2. dijkstra 函数:因为从一源到其余各点的最短路径共有n-1条,因此可以设一 变量vnum作为计数器控制循环

7、。该函数的关键在于dist数组的重新 置数。该置数条件是:该顶点是被访问过,并且新起点到该点的权值 加上新起点到源点的权值小于该点原权值。因此第一次将其设为:if(sw=0&costuw+distudistw)。但是在实际运行中,发 现有些路径的权值为负。经过分析发现,因为在程序中a由32767代 替。若 costuw=32767,那么 costuw+distu肯定溢出主负 值,因此造成权值出现负值。但是如果 costuw=32767,那么 distw肯定不需要重新置数。所以将条件改为: if(sw=0&costuw+distudistw&costuw!=32767)。 修改之后问题得到解决。

8、3. printpathl 函数:该函数主要用来输出源点到其余各点的最短路径。因为在主函 数调用该函数前,已经调用了 dijkstra函数,所以所需的dist、path、 s数组已经由dijkstra函数生成,因此在该函数中,只需用一变量控 制循环,一一将path数组中的每一元素回溯至起点即可。其关键在于 不同情况下输出形式的不同。4. printpath2 函数: 该函数主要用来输出两点间的最短路径。其主要部分与 printpath1 函数相同,只是无需由循环将所有顶点一一输出,只需将path数组中 下标为v1的元素回溯至起点并显示出来。4 调试与分析4.1 调试过程在调试程序时主要遇到一下

9、几类问题:1. 有时函数中一些数组中的数据无法存储。2. 对其进行检验发现没有申请空间大小。3. 在源程序的开头用#define定义数值大小,在使用数组时亦可 知道它的空间大小。4. 此函数中有时出现负值。5对其进行检验发现在程序中a由32767代替。若 costuw=32767,那么 costuw+distu肯定溢出主负值,因 此造成权值出现负值。6.但是当costuw=32767,那么distw肯定不需要重新置 数。所以将 if ( sw=0&costuw+distudistw)改为: if(sw=0&costuw+distudistw&costuw!=32767)。 问题得到解决。1.2

10、 程序执行过程系统使用说明:1. 输入的数据可以是整数,字符串(如1,2,3);2. 本系统可以建立带权图,并能够用Kruskal算法求改图的最小生成树。而且能够选择图上的任意一点做根结点。还能够求两点之间 的最短距离。3. 该系统会有菜单提示,进行选项:1. kruskal2. shortpath3. shortpath between two point4. exit4. 程序实际运行截图e:krua kalDe b ugk.rLaka点的的JRuiiAAA 6 籤霧2. 卫请诗a1U,权值);1.3.11.4.52-3.52.5.33.4.53.5.63.6.44.6.2體鴇煤魁曲亍導免

11、”十算法(起点,终点权值)2. short path笑点-起点)3 _ f?heM的tli between tun po i nt:(终点-起点)4.exit (很出I1:1:2:3TE列荣单中进彳亍选挥:图4.1输入形式,权值):1:2 :3 :4在列荣单中辺彳亍选挥1,4.51,3.1图4.2 kruskal算法输出e:krua kslDe b j gk rcalca I. eKe点的的 JR这边 AZA1U2.5.33.4.53.5.63.6.44,6,21-11-1算社:(起点,线点:权值)2. short path (线点V-起点)2 _ 氏hei*的tli between 7ljo

12、 po i ni:(终点-#卩点)4.exit (很出)1. kPuskalM法:起点,终点:权值)2. short path终点弋-起点)/3. short path betueen tuo point (终点 -超点)4. exit (退出)请输人起贻顶点序弓汐1-2:327fi72:327673-2:54-3-2:105-2:36-bcit (退出)3己始顶点韦吕:1 冬点序号:55-30)i=seti;return i;void kruskal(edgeset ge,int n,int e)int setMAXE,v1,v2,i,j;for(i=1;in+1;i+)seti=0;i=1

13、;j=1;while(j=e&i=n-1)v1=seeks(set,gej.bv);v2=seeks(set,gej.tv);if(v1!=v2) printf(%d,%d):%dn,gej.bv,gej.tv,gej.w);setv1=v2;i+;j+;void insertsort(edgeset ge,int e)int i,j;for(i=2;i=e;i+)if(gei.wgei-1.w)ge0=gei;j=i-1;while(ge0.wgej.w)gej+1=gej;j-;gej+1=ge0;distMAXE,intvoid dijkstra(int costMAXEMAXE,pat

14、hMAXE,int sMAXE,int n,int v0)int u,vnum,w,wm;for(w=1;w=n;w+)distw=costv0w;if(costv0w32767)pathw=v0;vnum=1;while(vnumn-1)wm=32767;u=v0;for(w=1;w=n;w+)if(sw=0&distwwm)u=w;wm=distw;su=1;vnum+;for(w=1;w=n;w+)if(sw=0&distu+costuwdistw&costuw!=32767)distw=distu+costuw;pathw=u;void printpath1(int dist,int

15、path,int s,int n,int v0) int i,k;for(i=1;i=n;i+)if(si=1)k=i;while(k!=v0)printf(%d-,k);k=pathk;printf(%d:%dn,k,disti);else printf(%d-%d:32767n,i,v0);void printpath2(int dist,int path,int v0,int v1)int k;k=v1;while(k!=v0)printf(%d-,k);k=pathk;printf(%d:%dn,k,distv1);main()edgeset geMAXE;int costMAXEMA

16、XE,distMAXE,pathMAXE,sMAXE,a,n,e,i,j,k,v 0,v1;prin tf(请输入顶点个数:);scanf(%d,&n);prin tf(请输入边的条数:);scanf(%d,&e);prin tf(请输入边的信息(起点,终点,权值):n); for(i=1;i=e;i+)scanf(%d,%d,%d,&gei.bv,&gei.tv,&gei.w);printf(在下列菜单中进行选择:n);printf(l.kruskal 算法(起点,终点)权值):n);printf(2.shortpath (终点-起点):n);pri ntf (3.shor tpath be

17、t ween two poi nt (终点起点): n);printf (4.exit (退出):n);scanf(%d,&a);while(a!=4)switch(a)case 1:insertsort(ge,e);kruskal(ge,n,e);break;case 2:prin tf(请输入起始顶点序号:);scanf(%d,&v0);for(i=1;i=n;i+)for(j=1;j=n;j+)costij=32767;for(k=1;k=e;k+)i=gek.bv;j=gek.tv; costij=gek.w;for(i=1;i=n;i+)si=0;sv0=1;dijkstra(cos

18、t,dist,path,s,n,v0); printpath1(dist,path,s,n,v0); break;case 3:prin tf(请输入起始顶点序号:); scanf(%d,&v0);prin tf(请输入终点序号:); scanf(%d,&v1); for(i=1;i=n;i+)for(j=1;j=n;j+)costij=32767;for(k=1;k=e;k+)i=gek.bv;j=gek.tv;costij=gek.w;for(i=1;i=n;i+)si=0;sv0=1;dijkstra(cost,dist,path,s,n,v0);printpath2(dist,path

19、,v0,v1);break;printf(在下列菜单中进行选择:n);printf(l.kruskal 算法(起点,终点)权值):n);printf (2.shortpath (终点起点):n);pri ntf (3.shor tpath bet ween two poi nt (终点起点):n);printf(4.exit (退出):n);scanf(%d,&a);return 1;课程设计总结:本次课程设计涉及到的围很广,让本人能够比较系统的对C语言和数据结构 进行一次整理和复习。同时有了很多的体会和经验。1. 巩固了以前学过的C语言的知识,在这次课程设计中我体会到C语言超 强的逻辑性,能

20、够熟练使用VC+的编译环境,也对这两门课程有了新的认识, 他们既有联系,又相互区别,在编写程序过程中要灵活应用2. 对数据结构的理解有待加强,算法的知识面也有待于提高。不同的人会 选择不同的算法,所以即使同样的程序,不同的人必然会设计出不同的方案,所 以以后的学习生活中,一定要广泛涉猎,掌握更多更好的解决问题的方法。3此次设计让我意识到程序设计是脑力劳动和体力劳动相结合的,没有平 时基础的训练是不会写出高效的算法。4此次课程设计时间虽短,课设的过程是短暂的,但我所收获的是永恒的。 它让我尝到了学习的快乐,成功的喜悅,更让我懂得了不少做人的道理。要完成 一项任务或把东西学好就必须有足够的信心,持久的耐心,有面对困难无所畏惧 的精神,这对我日后的学习和生活产生了深远一个影响。指导教师评语:指导教师(签字):年 月日课程设计成绩

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!