数据结构课程设计报告(最小生成树).docx
《数据结构课程设计报告(最小生成树).docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告(最小生成树).docx(17页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、数据构造课程设计报告课程名称:最小生成树课题负责人名学号 :同组成员名单角色:指导教师: 评阅成绩: 评阅意见:提交报告时间: 2023 年 12 月 19 日最小生成树计算机科学与技术 专业学生:指导教师:摘要 选择一颗生成树,使之总的消费最少,也就是要构造连通网的最小代价生成树简称为最小生成树的问题,一颗生成树的代价就是树上各边的代价之和,构造最小生成树可以有多种算法, 其中多数算法利用了 MST 的性质。关键词: 最小生成树 连通图 普里姆算法 克鲁斯卡尔算法 MST一、 设计目的1. 了解并把握数据构造与算法的设计方法,具备初步的独立分析和设计力量;2. 初步把握软件开发过程的问题分析
2、、 系统设计、程序编码、测试等根本方法和技能;3. 提高综合运用所学的理论学问和方法独立分析和解决问题的力量;4. 训练用系统的观点和软件开发一般标准进展软件开发,培育软件工作者所应具备的科学的工作方法和作风。二、 算法思想分析该设计的要求是在 n 个城市之间建设网络,不仅要保证连通,还要求是最经济的架设方法。 依据克鲁斯卡尔和普里姆算法的不同之处,该程序将城市个数大于十个时应用普里姆算法求最小生成树,而城市个数小于十个时则应用克鲁斯卡尔进展计算。1. 算法思想1) 普里姆 Prim算法思想a) 选择从 0 节点开头,并选择 0 节点相关联的最小权值边,将与这条边相关联的另一顶点出列;b) 在
3、出列的节点中相关联的全部边中选择一条不与另一个已出列的节点相关联的权值最小的边,并将该边相关联的节点出列;c) 重复 b)直到全部的节点出列。2) 克鲁斯卡尔 Kruskal 算法思想为了使生成树上总的权值之和最小,应当使每一条边上的权值尽可能的小,所以应从权值最小的边选起,直至选出 n-1 条不能构成回路的权值最小的边位置。具体做法如下:首先构造一个含 n 个顶点的森林,然后按权值从小到大从连通图中选择不使森林中产生回路的边参加到森林中去,直至该森林变成一棵树为止,这棵树便是连通图的最小生成树。由于生成树上不允许有回路,因此并非每一条居当前最小的边都可选。从生成树的构造过程可见,初始态为个顶
4、点分属 n 棵树,互不连通,每参加一条边,就将两棵树合并为一棵树,在同一棵树上的两个顶点之间自然相连通,由此判别当前权值最小边是否可取只要判别它的两个顶点是否在同一棵树上即可。n2.系统承受的数据构造和算法1)数据构造Typedef int Vertextype;Typedef int adimatrixMaxVertexNumMaxVertexNum;TypedefintVertextype vexlistMaxVertexNum;TypedefintVexType;TypedefintAdjType;Typedef struct edgeElem edgesetMaxVertexNum;s
5、truct edgeElemint fromvex;/ 头顶点int endvex;/ 尾顶点int weight;/ 权;Typedef structint n;/ 图的顶点个数AdjType acrsMAXVEXMAXVEX;/ 边信息GraphMatrix;Typedef structint start_vex,stop_vex;/ 边的起点和终点AdjType weight;/ 边的权Edge;Edge mst5;2) 算法Great_adjmatrix; Great_adjmatrix2; Kruskal; out_edgeaet; prim;三、 算法的描述与实现1. Great_
6、adjmatrix 和 Great_adjmatrix2 是两种建立图的方法;2. 克鲁斯卡尔算法 Kruskal :Void kruskal(GraphMatrix * pgraph,Edge mst)int i,j,min,vx,vy; int weight,minweight; Edge edge;for(i=0;in-1;i+)msti.start_vex = 0; Msti.stop_vex = i+1;Msti.weight = pgraph-arcs0i+1;for(i=0;in-1;i+)/ 共 n-1 条边minweight = MAX; min = i;for(j=i;jn
7、-1;j+)/从全部 vx,vy vxU,vy V-U中选出最短的边 if(mstj.weightminweight)minweight = mstj.weight; min = j;/mstmin 是 最 短 的边 (vx,vy)(vx U,vy V-U), 将mstmin 参加最小生成树edge = mstmin; mstmin = msti; msti = edge;vx = msti.stop_vex;/vx 为刚参加最小生成树的顶点的下标for(j=i+1;jn-1;j+)vy=mstj.stop_vex;weight=pgraph-arcsvxvy; if(weightmstj.w
8、eight)mstj.weight=weight; mstj.start_vex = vx;3. 普里姆算法 Prim :void prim(adjmatrix GA,edgeset MST,int n)/利用 prim 算法从 0 点动身求图的最小生成树int i,j,t,k,w,min,m; struct edgeElem x; for(i=0;i0)/ 从 0 点连接其余顶点MSTi-1.fromvex=0; MSTi-1.endvex=i;MSTi-1.weight=GA0i;for(k=1;kn;k+)min=MaxValue; m=k-1;for(j=k-1;jn-1;j+) if
9、(MSTj.weightmin)min=MSTj.weight; M=j;/选择从 0 点动身权值最小的边x=MSTk-1;MSTk-1=MSTm;MSTm=x;/ 交换位置j=MSTk-1.endvex;/ 定位于权值最小边的尾顶点for(i=k;in-1;i+)/ 选取轻边t=MSTi.endvex; w=GAjt;if(wMSTi.weight)MSTi.weight=w; MSTi.fromvex=j;4. out_edgeset 功能为显示最小生成树。四、 运行程序运行程序,得到如下窗口,如图 1:输入顶点数,选择算法:当输入的顶点数小于 10 时,选择 Kruskal 算法,如图
10、2当输入的顶点数大于 10 时,选择 Prim 算法,如图 3输入顶点序号,如图 4:输入边的状况,完成图的建立,如图 5:最终,输入 0 则完毕程序,输入 1 则连续。五、 结论该程序实现了在 n 个城市之间建设网络,既保证了连通性, 也成为了最经济的架设方法。 程序中应用了普里姆算法和克鲁斯卡尔算法,实现了矩阵的输出以及最小生成树的输出。 不过, 该程序仍有缺乏之处,图的输入数据过大,易出错,不易返回, 仍需完善。参考文献1 数据构造程序设计题典 李春葆编 清华大学出版社2 数据构造 C 语言版 严蔚敏 吴伟民编 清华大学出版社3 数据构造课程设计 苏仕华编 机械工业出版社附录:源代码#i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 报告 最小 生成
限制150内