数据结构prim算法vc++编程.docx
- 文档编号:7111372
- 上传时间:2023-01-18
- 格式:DOCX
- 页数:9
- 大小:92.14KB
数据结构prim算法vc++编程.docx
《数据结构prim算法vc++编程.docx》由会员分享,可在线阅读,更多相关《数据结构prim算法vc++编程.docx(9页珍藏版)》请在冰豆网上搜索。
数据结构数据结构prim算法算法vc+编程编程数据结构课程设计目录摘要、关键字3第一章、需求分析3第二章、数据结构定义及其操作实现4第三章、程序设计及其实现5第四章、运行结果及其分析9第五章、问题及其解决方法10第六章、心得体会(设计总结)11第七章、其他11摘要最小生成树是数据结构中图的一种重要应用,在图中对于n个顶点的连通网可以建立许多不同的生成树,最小生成树就是在所有生成树中总的代价最小的生成树。
本课程设计是以邻接矩阵作为图的存储结构,采用Prim算法求最小生成树。
Prim算法是求最小生成树的常用算法它们分别适用于稠密图和稀疏图。
最小生成树的应用非常的广,如矿井通风设计和改造最优化方面以及如何搭建最短的网络线缆,构建造价最低的通讯网络。
关键词:
最小生成树;邻接矩阵;Prim算法第一章、需求分析一、目的本课程设计的目的是了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;提高综合运用所学的理论知识和方法独立分析和解决问题的能力;训练用系统的观点和软件开发一般规范进行软件开发。
二、要求问题要求:
给定一个地区的n个城市的距离网,用prim算法和kruscal算法建立最小生成树,并计算出最小生成树的代价。
程序运行环境:
windows、visualc+或java等要求:
1)城市间距离用邻接矩阵表示,邻接矩阵的存储结构用书本定义表示,若城市间不存在道路,则将相应边的权值用自己定义的无穷大表示,要求在屏幕上显示得到的最小生成树中包括了哪些城市间的道路,并显示出得到的最小生成树的代价。
2)表示城市间距离的邻接矩阵(至少6个城市10条道路);3)给出使用的数据结构的ADT及其实现;4)最小生成树中包括边及其权值,并显示出得到的最小生成树的代价:
第二章、数据结构定义及其操作实现抽象数据类型图的定义如下:
ADTGraph数据对象V:
V是具有相同特性的数据元素的集合,称为顶点集。
数据关系R:
R=VRVR=|v,w属于v且p(v,w),(v,w)表示从v到w的弧,谓词p(v,w)定义了弧的意义或信息基本操作P:
CreatGraph(&G,V,VR);初始条件:
V是图的顶点集,VR是图中弧的集合。
操作结果:
按V和VR的定义构造图G。
DestoryGraph(&u);初始条件:
图G存在。
操作结果:
销毁图G。
LocateVex(G,u);初始条件:
图G存在,u和G中顶点有相同的特征。
操作结果:
若G中存在顶点u,则返回该顶点在图中的位置;否则返回其他信息。
GetVex(G,v);初始条件:
图G存在,v是图中某个顶点。
操作结果:
返回v的值。
PutVex(&G,v,value);初始条件:
图G存在,v是G中某个顶点。
操作结果:
对v赋值value。
NextAdjVex(G,v,w);初始条件:
图G存在,v是图中某个顶点,w是v的邻接顶点。
操作结果:
返回v的(相对于w的)下一个邻接顶点。
若w是v的最后一个邻接点,则返回“空”。
BFSTraverse(G,Visit();初始条件:
图G存在,Visit是顶点的应用函数。
操作结果:
对图进行广度优先遍历。
在遍历过程中对每个顶点调用函数Visit一次且仅一次。
一旦visit()失败,则操作失败。
ADTGraph第三章、程序设计及其实现一、主要功能逻辑过程和实现算法二、主要函数模块设计1、图的邻接矩阵模块:
intcreatMGraph(MGraph&G)charv1,v2;inti,j,w;printf(建立邻接矩阵:
n);printf(请输入图G顶点(城市)和弧(边)的个数:
);scanf(%d,&G.vexnum);scanf(%d,&G.arcnum);printf(输入所有顶点:
);for(i=0;iG.vexsi;for(i=0;iG.vexnum;i+)for(j=0;jG.vexnum;j+)G.arcsij.adj=int_max;G.arcsij.info=NULL;printf(输入所有边及依附的顶点(城市)和权(距离):
n);for(intk=0;kv1v2w;/输入一条边衣服的两点及权值i=localvex(G,v1);/确定顶点v1和v2在图中的位置j=localvex(G,v2);G.arcsij.adj=w;G.arcsji.adj=w;ljjzprint(G);printf(图G邻接矩阵创建成功!
n);returnG.vexnum;2、prim求解模块:
intprim(intgmax,intn)/最小生成树PRIM算法/prevex存储最短路径在U中的结点intlowcostmax,prevexmax;/lowcost存储当前集合U分别到剩余结点的最短路径inti,j,k,min;intsum=0;for(i=2;i=n;i+)/n个顶点,n-1条边lowcosti=g1i;/初始化prevexi=1;/顶点未加入到最小生成树中lowcost1=0;/标志顶点1加入U集合for(i=2;i=n;i+)/形成n-1条边的生成树min=inf;k=0;for(j=2;j=n;j+)/满足边的一个顶点在U,另一个顶点在v的最小边if(lowcostjmin)&(lowcostj!
=0)min=lowcostj;k=j;printf(%d,%d)%dt,prevexk-1,k-1,min);sum+=min;lowcostk=0;for(j=2;j=n;j+)/修改由顶点k到其他顶点边的权值if(gkjs;switch(s)case1:
d=creatMGraph(G);vnodev;coutendl注意:
若该图为非强连通图(含有多个连通分量)时endl最小生成树不存在,则显示为非法值endlendl;break;case2:
coutkruskal算法求解如下:
endl;D=(MGraphA*)malloc(sizeof(MGraphA);CreatGraph(D);MiniSpanTree(D);break;printf(n);coutendly;if(y=n)break;第四章、运行结果及其分析将程序员录入后,让其运行。
将会出现一个菜单的界面,执行各种操作均有其对应的代码。
要执行何种操作只需输入对应的指令即可进行,在每步操作后均会有相应的提示。
操作简单方便实用,下面即为一些操作的示意图。
运行程序后出界面,运行结果如图1所示。
图1图中有1-2两个个选项,可选取其中的一个选项进行操作。
选取选项1进行操作,运行结果如图2所示。
图2依据提示,分别输入无向图的顶点个数与弧的个数,然后依次输入各个顶点所对应的符号及与各个顶点相关联的弧与权值,存在邻接矩阵中。
图3图中显示了求得的最小生成树所对应的边、权值第五章、问题及其解决方法由于对数据结构和c语言不是很了解,尽管在参考其它资料的时候也忽略了一些关键的细节,使得在编写程序的过程中出现了一些问题。
1、问题一:
求出图中的最小值现象:
求出的最小值是0原因:
图中没有连通的两个顶点之间的权值赋值为02、问题二:
求最小生成树时,else语句需再调用一个函数现象:
对某些二叉树能求出最小生成树,但不能普遍适应原因:
对于找最小生成树边的各种可能没有考虑全面,代码才没有广泛的适应性第七章、其他参考文献:
1严蔚敏.数据结构(C语言版)M.北京:
清华大学出版社,1997.2谭浩强.C程序设计(第三版)M.北京:
清华大学出版社,2005.1.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 prim 算法 vc 编程