最小生成树课程设计.docx
- 文档编号:12575184
- 上传时间:2023-04-20
- 格式:DOCX
- 页数:14
- 大小:61.76KB
最小生成树课程设计.docx
《最小生成树课程设计.docx》由会员分享,可在线阅读,更多相关《最小生成树课程设计.docx(14页珍藏版)》请在冰豆网上搜索。
最小生成树课程设计
江西理工大学应用科学学院
数据结构课程设计
课程名称:
数据结构
题目:
最小生成树问题
年级/专业/班:
08级计算机科学与技术一班
学生姓名:
许林红
学号:
08060508124
指导教师:
康岚兰
开题时间:
2010年6月21日
完成时间:
2010年7月2日
目录
摘要2
一、引言3
二、设计目的与任务3
1、课程设计目的3
2、课程设计的任务3
三、设计方案4
1、需求分析4
2、概要设计4
3、详细设计5
四、调试分析与体会9
五、运行结果10
六、结论12
七、感想12
八、参考文献12
摘要
最小生成树是数据结构中图的一种重要应用,在图中对于n个顶点的连通网可以建立许多不同的生成树,最小生成树就是在所有生成树中总的代价最小的生成树。
本课程设计是以邻接矩阵作为图的存储结构,分别采用Prim和Kruskal算法求最小生成树。
Kruskal算法和Prim算法是求最小生成树的常用算法它们分别适用于稠密图和稀疏图。
最小生成树的应用非常的广,如矿井通风设计和改造最优化方面以及如何搭建最短的网络线缆,构建造价最低的通讯网络。
关键词:
最小生成树;Kruskal算法;Prim算法
Abstract
TheminimumCostspanningtreedatastructureisanimportantapplicationofChinese,inthepicturefornvertexevenTongWangcancreatemanydifferentspanningtree,minimumspanningtreeisinallspanningtreeinthetotalcostoftheminimumspanningtree.Thiscourseisdesignedasafigureoftheadjacencymatrixstoragestructure,weadoptPrimandKruskalminimumspanningtreealgorithm.KruskalPrimalgorithmandminimumspanningtreealgorithmisusedforthealgorithmrespectivelyapplicableandsparselypopulated.Minimumspanningtreeisverywideapplicationinmines,suchastheventilationdesignandmodificationandoptimizationinhowtosetuptheshortestcablenetwork,constructingthelowestcostofcommunicationsnetwork
Keywords:
MinimumCostSpanningTree;Kruskalalgorithm;Primalgorithm
《数据结构》课程设计
------最小生成树
一、引言
《数据结构》是计算机科学与技术专业和信息管理与信息系统专业的必修课之一,是一门综合性的专业基础课。
本课程较系统地介绍了软件设计中常用的数据结构以及相应的实现算法,如线性表、栈、队列、树和二叉树,图、检索和排序等,并对性能进行分析和比较,内容非常丰富。
本课程设计我们要解决的问题是图最小生成树问题。
要用到图的先相关数据结构和求最小生成树的两种数据结构算法普里姆算法和克鲁斯卡尔算法,以及储存图的边和点的邻接矩阵。
本课程设计要解决的问题构造连通网的最小生成树,我们首先要做的是创建一个邻接矩阵,用以来存储图,然后我们要想好怎样利用普里姆算法和克鲁斯卡尔算法来构造最小生成树。
把这两种算法写入主函数,调试好程序。
最后写好报告。
二、设计目的与任务
1、课程设计目的
本课程设计的目的是了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;提高综合运用所学的理论知识和方法独立分析和解决问题的能力;训练用系统的观点和软件开发一般规范进行软件开发。
2、课程设计的任务
问题描述:
已知一个无向连通网表示n个城市以及城市间可能设置的通信线路,其中网的顶点表示城市,边表示两个城市之间的线路,赋于边上的权值表示相应的代价。
对于n个点的连通网能建立许多不同的生成树,每一棵生成树都可以是一个通信网。
我们要选择一棵生成树,使总的耗费最小。
三、设计方案
1、需求分析
1)建立一个图,其存储方式可以采用邻接矩阵形式,需要定义两个数组,一个存储顶点,一个存储边,存储边的数组表明节点间的连通关系和边的权值;。
2)利用普里姆算法和克鲁斯卡尔算法求网的最小生成树
3)按顺序输出生成树中各条边以及它们的权值。
2、概要设计
1)抽象数据类型(ADT)如下:
ADTGraph
{数据对象V:
v是具有相同特性的数据元素的集合,称为顶点集。
数据关系R:
R={VR}
VR={
基本操作:
(1)CreatGraph(&G,V,VR);
初始条件:
V是图的顶点集,VR是图中弧的集合。
操作结果:
按V和VR的定义构造图G。
(2)LocateVex(G,u);
初始条件:
图G存在,u和G中顶点有相同的特征。
操作结果:
若G中存在顶点u,则返回该顶点在图中的位置;否则返回其他信息。
(3)DestoryGraph(&u);
初始条件:
图G存在。
操作结果:
销毁图G。
(4)GetVex(G,v);
初始条件:
图G存在,v是图中某个顶点。
操作结果:
返回v的值。
(5)NextAdjVex(G,v,w);
初始条件:
图G存在,v是图中某个顶点,w是v的邻接顶点。
操作结果:
返回v的(相对于w的)下一个邻接顶点。
若w是v的最后一个邻接点,则返回“空”。
(6)BFSTraverse(G,Visit());
初始条件:
图G存在,Visit是顶点的应用函数。
操作结果:
对图进行广度优先遍历。
在遍历过程中对每个顶点调用函数Visit一次且仅一次。
一旦visit()失败,则操作失败。
}
2)存储结构
Typedefstruct
{
intadj;
intweight;
}AdjMatrix[MAX][MAX];
Typedefstruct
{
djMatrixarc;
intvexnum,arcnum;
}MGraph;
3)流程图
3、详细设计
在该函数中主要有五段代码块,分别是主函数代码块、邻接矩阵定义模块代码、创建链接矩阵模块代码、最小生成树Prim算法及代价模块代码与最小生成树kruskal算法及代价模块代码,五段代码块分别有着不同的作用,共同满足了课题所需要实现的功能。
1)主函数模块代码
algraphgra;MGraph_LG;inti,d,g[20][20];
chara='a';d=creatMGraph_L(G);vnodev;
cout< 若该图为非强连通图(含有多个连通分量)时"< <<"最小生成树不存在,则显示为非法值"< cout<<"…………………菜单……………………"< cout<<"0、显示该图的邻接矩阵……………………"< cout<<"1、最小生成树PRIM算法及代价…………………"< ints;chary='y'; while(y='y'){cout<<"请选择菜单: "< switch(s){ case0: cout<<"邻接矩阵显示如下: "< case1: for(i=0;i! =G.vexnum;++i) for(intj=0;j! =G.vexnum;++j)g[i+1][j+1]=G.arcs[i][j].adj; cout<<"prim: "< cout< y/n: ";cin>>y;if(y=='n')break;} } 该主函数用一个循环语句,来执行其它的函数的功能。 从键盘输入顶点数和边数上限,再调用定义连接矩阵的函数,后输出创建连接矩阵的信息,再调用creatMGraph()函数,接着进入菜单,然后再选择输入一个数确定是要输出连接矩阵还是最小生成树及代价,最后选择输入确定字母y或N确定是否继续。 2)邻接矩阵定义模块代码 typedefstructArcCell{ intadj;char*info; }ArcCell,AdjMatrix[20][20]; typedefstruct{ charvexs[20];AdjMatrixarcs; intvexnum,arcnum; }MGraph_L; intlocalvex(MGraph_LG,charv) {inti=0;while(G.vexs[i]! =v){++i;}returni;} 用typedefstruct定义连接矩阵,通过二维数组来存储连接矩阵,并设定参数的最大值为20。 3)创建链接矩阵模块代码 intcreatMGraph_L(MGraph_L&G) {charv1,v2;inti,j,w; cout<<"…………创建无向图(城市分布图)…………"< (46)不包括“()”"< cin>>G.vexnum>>G.arcnum; for(i=0;i! =G.vexnum;++i) {cout<<"输入顶点(城市)"<>G.vexs[i];} for(i=0;i! =G.vexnum;++i) for(j=0;j! =G.vexnum;++j) {G.arcs[i][j].adj=int_max;G.arcs[i][j].info=NULL;} for(intk=0;k! =G.arcnum;++k) {cout<<"输入一条边依附的顶点(城市)和权(距离): (ab3)不包括“()”"< i=localvex(G,v1);j=localvex(G,v2); G.arcs[i][j].adj=w;G.arcs[j][i].adj=w;} cout<<"图G邻接矩阵创建成功! "< 该语句是从键盘输入顶点数和边数,输入顶点和权值,通过循环语句的调用,最后调用creatMGraph_L()创建连接矩阵。 4)最小生成树Prim算法及代价模块代码 intprim(intg[][max],intn){ intlowcost[max],prevex[max];inti,j,k,min;intsum=o; for(i=2;i<=n;i++){lowcost[i]=g[1][i];prevex[i]=1;} lowcost[1]=0;for(i=2;i<=n;i++)//形成n-1条边的生成树 {min=inf;k=0; for(j=2;j<=n;j++) if((lowcost[j] =0)){min=lowcost[j];k=j;} printf("(%d,%d)%d\t",prevex[k]-1,k-1,min); sum+=min;lowcost[k]=0; for(j=2;j<=n;j++)if(g[k][j] {lowcost[j]=g[k][j];prevex[j]=k;} printf("\n");} cout<<"最少生成树的代价: ";cout< 该语句运用一系列的循环语句来实现的,利用前面的创建好的链接矩阵,通过各边权值的比较,最后调用prim()函数,实现最小生成树的生成,同时运用sum把最小生成树各边权值相加得到最小生成树的代价。 5)最小生成树kruskal算法及代价模块代码 voidMiniSpanTree(MGraphA*D)//生成最小生成树 {inti,j,n,m,SUM=0;intk=1; intparent[M];edgeedges[M]; for(i=1;i {for(j=i+1;j<=D->vexnum;j++){if(D->arc[i][j].adj==1) {edges[k].begin=i;edges[k].end=j; edges[k].weight=D->arc[i][j].weight;k++;} } } sort(edges,D); for(i=1;i<=D->arcnum;i++) {parent[i]=0;} printf("最小生成树为: \n"); for(i=1;i<=D->arcnum;i++)//核心部分 {n=Find(parent,edges[i].begin);m=Find(parent,edges[i].end); if(n! =m){parent[n]=m; printf("<<%d,%d>>%d\n",edges[i].begin,edges[i].end,edges[i].weight); SUM=SUM+edges[i].weight;} } cout<<"最少生成树的代价: ";cout< 该语句运用一系列的循环语句来实现的,利用前面的创建好的链接矩阵,通过各边权值的比较,最后调用MiniSpanTree()函数,实现最小生成树的生成,同时运用sum把最小生成树各边权值相加得到最小生成树的代价。 四、调试分析与体会 在我组的集体努力下,课程设计终于完成,由于我们对数据结构和c语言不是很了解,有时忽略了一些关键的细节,使得在编写程序的过程中出现了一些问题。 对于打字有时粗心导致出现一些难以发现的小错误,在我们的耐心,细致的调试下最终使得程序能够运行,课程设计完满完工。 1、问题一: 求出图中的最小值 现象: 求出的最小值是0 原因: 图中没有连通的两个顶点之间的权值赋值为0 2、问题二: 求最小生成树时,else语句需再调用一个函数 现象: 对某些二叉树能求出最小生成树,但不能普遍适应 原因: 对于找最小生成树边的各种可能没有考虑全面,代码才没有广泛的适应性 3、问题三: 两个顶点之间的边是否是最小生成树的边 现象: 代码的功能不能分辨出是否是最小生成树的边 原因: 把简单的代码写的很复杂,从而杂乱无章出现错误。 五、运行结果 将程序员录入后,让其运行。 将会出现一个菜单的界面,执行各种操作均有其对应的代码。 要执行何种操作只需输入对应的指令即可进行,在每步操作后均会有相应的提示。 操作简单方便实用,下面即为一些操作的示意图。 图中有1-2两个选项,可选取其中的一个选项进行操作。 选取选项1进行操作, 运行程序后出界面,运行 图1初界面 运行结果如图2所示。 图2建立邻接矩阵 依据提示,分别输入无向图的顶点个数与弧的个数,然后依次输入各个顶点所对应的 符号及与各个顶点相关联的弧与权值,存在邻接矩阵中。 图3求的最小生成树 图中显示了求得的最小生成树所对应的边、权值与最小生成树的代价。 六、结论 经过我们不懈的努力我们终于完成了本次课程设计,通过这次课程设计,我感觉到要真正做出一个程序并不很容易,但只要用心去做,总会有收获,特别是当我遇到一个问题,想办法去解决,最后终于找到方法时,心里的那份喜悦之情真是难以形容。 编写程序中遇到问题再所难免,应耐心探究其中的原因,从出现问题的地方起,并联系前后程序,仔细推敲,逐个排查。 直到最终搞清为止。 我们本次做的是图的做小生成树问题,深刻的体会到它的实用性。 通过本次课程设计我们发现我们对于C语言和数据结构还有很多地方不知道,今后需要努力学习。 七、感想 在这里我真心的感谢康岚兰老师对我们精心的指导和不倦的教育,她在我们的课程设计过程中提出了指导性的方案和架构,时事关注我们设计的进程,并指引我们阅读相关的资料和书籍,使我们的课设能够按时顺利的完成。 同时也感谢学校给我们这次机会,训练我们灵活应用所学数据结构知识,独立完成问 题分析的能力,让我们学会怎样结合数据结构理论知识去解决实际问题。 八、参考文献 [1]严蔚敏.数据结构(C语言版)[M].北京: 清华大学出版社,1997. [2]谭浩强.C程序设计(第三版)[M].北京: 清华大学出版社,2005.1. [3]陈杰.计算机专业课程设计中的需求分析[J].集美大学学报,2009,10 (2): 89—92.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最小 生成 课程设计