图论编程题3参考构成可以使n个城市连接的最小生成树Word文档下载推荐.docx
- 文档编号:17918411
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:13
- 大小:77.17KB
图论编程题3参考构成可以使n个城市连接的最小生成树Word文档下载推荐.docx
《图论编程题3参考构成可以使n个城市连接的最小生成树Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《图论编程题3参考构成可以使n个城市连接的最小生成树Word文档下载推荐.docx(13页珍藏版)》请在冰豆网上搜索。
typedefintVRType;
//权值,即边的值
typedefcharInfoType;
//附加信息的类型,后面使用时会定义成一个指针
typedefcharVertexType[MAX_VERTEX_NUM];
//顶点类型
typedefenum{DG=1,DN,UDG,UDN}GraphKind;
//{有向图,有向网,无向图,无向网}
typedefstructArcCell
{
VRTypeadj;
//VRType是顶点关系类型。
对无权图,用1或0表示相邻否;
对带权图,则为权值类型。
InfoType*info;
//该弧关系信息的指针
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedefstruct
VertexTypevexs[MAX_VERTEX_NUM];
//顶点向量
AdjMatrixarcs;
//邻接矩阵
intvexnum,arcnum;
//图的当前顶点数和弧数
GraphKindkind;
//图的种类标志
}MGraph;
typedefstruct//普里姆算法辅助数组的定义
VertexTypeadjvex;
VRTypelowcost;
}closedge[MAX_VERTEX_NUM];
#endif//结束if
2.2程序模块
MGraphG;
//网G,唯一的全局变量
intmain(intargc,char*argv[]);
//主函数
StatusLocateVex(MGraphG,VertexTypev);
//判断城市v在网G中的位置
StatusCreateUDN(MGraph&
G);
//创建网G的邻接矩阵
voidDisplayNet(MGraphG);
//以邻接矩阵的形式显示网G
voidMiniSpanTree_KRUSKAL(MGraphG);
//最小生成树的Kruskal算法
voidMiniSpanTree_PRIM(MGraphG,VertexTypeu);
//最小生成树的Prim算法
StatusMinimum(closedgecloseEdge,intn);
//Prim算法中求下一个城市的函数
voidDeleteInfo(MGraph&
//释放堆内存上动态申请的空间
2.3流程图
创建用邻接矩阵表示的城市道路网
输入城市数G.vexnum、
道路数G.arcnum
输入城市名G.vexs[i]
输入表示道路的两个城市及道路值G.arcs[i][j].adj
返回OK
2.3.1创建邻接矩阵的流程图(N-S图)
Prim算法
化辅助数组closeEdge
for(i=1;
i<
G.vexnum;
++i)
求下一个城市k=Minimum(closeEdge,G.vexnum)
输出找到的道路
标记城市,避免重复
输出总耗费
图2.3.2Prim算法流程图(N-S图)
三.详细设计
3.1数据类型定义
为了用邻接矩阵表示图G,先是定义二维数组的每一个元素含道路值然后在图的定义中定义一个此二维数组的结构成员。
并且在图中还定义一个用来存放城市的一维数组及int型的城市数级道路数。
用二维数组的两个下标表示道路,这两个下标又在一位数组中对应两个城市。
这样就建立起了一个城市到城市之间的道路网。
3.2程序主要模块
说明:
该程序共含5个模块,本人负责其中2个模块构造:
3.2.1初始化图G
***************LocateVex(MGraphG,VertexTypev)****************
while(strcmp(G.vexs[i],v)){i++;
}
返回i;
****************CreateUDN*************************
输入城市数、道路数;
for(i=0;
城市数;
++i)输入城市名;
for(j=0;
j<
++j)
初始化邻接矩阵:
道路值=INFINITY;
输入两个城市表示道路,输入道路值;
3.2.2PRIM算法
**************************MiniSpanTree_PRIM*********
voidMiniSpanTree_PRIM(MGraphG,VertexTypeu)
定义辅助数组:
closedgecloseEdge;
初始化:
strcpy(closeEdge[j].adjvex,u);
closeEdge[j].lowcost=G.arcs[k][j].adj;
for(i=1;
{
在其余G.vexnum-1个城市中找到离辅助数组中标记的道路最小值;
显示找到的道路;
标记新找到的城市;
**********************Minimum*****************
StatusMinimum(closedgecloseEdge,intn)
在辅助数组中找到道路值最小的道路的两点城市:
if((closeEdge[i].lowcost!
=0)&
&
(minTemp>
closeEdge[i].lowcost))
返回该城市在G中的位置
四.调试分析和测试结果
4.1调试分析
4.1.1邻接矩阵初始化
本函数的主要功能是对无向网进行邻接矩阵的初始化。
构造这种具有n个顶点和e条边的无向网时,关键需要考虑其时间复杂度O(n^+e*n),其中对邻接矩阵G.arcs的初始化花费了O(n^)的时间。
4.1.2Prim算法
Prim算法的思路是逐步将城市纳入生成树中,这里面的关键步骤是要找到下一个城市。
于是通过讨教别人,写了StatusMinimum(closedgecloseEdge,intn)
函数,这样就可以在辅助数组中找到道路值最小的道路的两点城市了。
4.2测试结果
图4.2.1邻接矩阵初始化运行显示界面
图4.2.2Prim算法运行显示界面
五.总结
通过本周的课程设计,我们小组终于圆满完成了课程设计的任务,我也有不少收获。
既巩固和加深了对数据结构的理解,认识到《数据结构》是计算机专业一门重要的专业技术基础课程,还提高了我综合运用本课程所学知识的能力。
而且,并不是单纯的看看教材就能解决我们的实际问题,所以还要去查找各种我们所需要的资料,所以这次课程设计也培养了我选用参考书,查阅手册及文献资料的能力。
要完成一个课程设计的课题并不是一次就能编译成功的,中间会出现很多的大问题小问题,改错是个很繁琐的问题。
通过这次课程设计培养了我独立思考,深入研究,分析问题,解决问题的能力。
在以后的学习过程中我将要注意以下几点:
1、认真上好专业实验课,多在实践中锻炼自己。
2、写程序的过程要考虑周到,严密。
3、在做设计的时候要有信心,有耐心,切勿浮躁。
4、认真的学习课本知识,掌握课本中的知识点,并在此基础上学会灵活运用。
5、在课余时间里多写程序,熟练掌握在调试程序的过程中所遇到的常见错误,以便能节省调试程序的时间。
六.参考文献
[1].严蔚敏,吴伟民.数据结构(C语言版).清华大学出版社,2007
[2].谭浩强,张基温.C语言程序设计教程(第三版)北京:
高等教育出版社,2006
[3].陈维新,林小茶.C++面向对象程序设计教程.北京:
清华大学出版社,2004
[4].苏仕华等.数据结构课程设计.北京:
机械工业出版社,2005
七.致谢
感谢梁英老师对我们《数据结构》课程及其实验的悉心指导,正是因为老师在实验课上的指导,让我能够把书本上的知识化成自己的知识,并运用在编程的过程中。
感谢同学在我的设计过程中提出的宝贵意见,如果没有他们的帮助,我在设计过程中出现的一些错误可能无法迅速查出解决,你们的帮助为我节省了宝贵的时间。
衷心感谢!
八.附录
//main
#include<
iostream.h>
stdio.h>
string.h>
windows.h>
#include"
TypeDefine.h"
AdjacencyMatrix.h"
InitializeFunction.h"
MiniSpanTree_KRUSKAL.h"
MiniSpanTree_PRIM.h"
DisplayNet.h"
DeleteInfo.h"
//全局变量G
//主函数
//判断城市v在网G中的位置
//创建网G的邻接矩阵
//以邻接矩阵的形式显示网G
//最小生成树的Kruskal算法
//最小生成树的Prim算法
//Prim算法中求下一个城市的函数
//释放堆内存上动态申请的空间
intmain(intargc,char*argv[])
CreateGraph(G);
DisplayNet(G);
MiniSpanTree_KRUSKAL(G);
MiniSpanTree_PRIM(G,G.vexs[0]);
DeleteInfo(G);
cout<
<
endl<
endl;
system("
pause"
);
return0;
//intializeFunction.h
StatusCreateDG(MGraph&
G){return0;
};
StatusCreateDN(MGraph&
StatusCreateUDG(MGraph&
StatusLocateVex(MGraphG,VertexTypev)
//判断输入的顶点v在G中的位置。
//根据顶点的类型,可重载此函数。
目前为char
inti=0;
while(strcmp(G.vexs[i],v)){i++;
returni;
StatusCreateGraph(MGraph&
G)
//采用数组(邻接矩阵)表示法,构造图G.
G.kind=UDN;
//默认构造无向网
/*printf("
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"
printf("
|1:
有向图2:
无向图3:
有向网4:
无向网\n"
|请选择:
[]\b\b"
scanf("
%d"
&
G.kind);
*/
switch(G.kind)
{
caseDG:
returnCreateDG(G);
//构造有向图G
caseDN:
returnCreateDN(G);
//构造有向网G
caseUDG:
returnCreateUDG(G);
//构造无向图G
caseUDN:
returnCreateUDN(G);
//构造无向网G
default:
returnERROR;
}
}//CreateGraph
inti,j,k;
VertexTypev1,v2;
VRTypew;
构造可以使N个城市连接的最小生成树\n"
请输入城市数、道路数(至少6个城市,10条道路):
"
cin>
>
G.vexnum>
G.arcnum;
for(i=0;
++i)//构造顶点向量
printf("
请输入第%d个城市名(共%d个):
i+1,G.vexnum);
cin>
G.vexs[i];
++i)//初始化邻接矩阵
for(j=0;
G.arcs[i][j].adj=INFINITY;
//G.arcs[i][j].info=NULL;
}
请输入一条道路连接的两个城市名及权值:
\n"
for(k=0;
k<
++k)//构造邻接矩阵
共%3d条道路,第%3d条道路:
G.arcnum,k+1);
v1>
v2>
w;
//输入一条边依附的顶点及权值
i=LocateVex(G,v1);
//确定v1、v2在G中的位置
j=LocateVex(G,v2);
G.arcs[i][j].adj=w;
//弧<
v1,v2>
的权值
G.arcs[j][i]=G.arcs[i][j];
//置<
的对称弧<
v2,v1>
returnOK;
}//CreateUDN
//MiniSpanTreePRIM.h
inti,flag,minTemp=INFINITY;
n;
if((closeEdge[i].lowcost!
minTemp=closeEdge[i].lowcost;
flag=i;
returnflag;
//用普里姆算法从第u个顶点出发构造网G的最小生成树T,输出T的各条边。
//记录从顶点集U到V-U的代价最小的边的辅助数组定义见"
inti,j,k,totalCost=0;
closedgecloseEdge;
k=LocateVex(G,u);
for(j=0;
++j)//辅助数组初始化
if(j!
=k)
strcpy(closeEdge[j].adjvex,u);
closeEdge[j].lowcost=G.arcs[k][j].adj;
\n\n+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\\\n"
;
|用Prim算法求最小生成树的各条边依次为:
\n-----"
closeEdge[k].lowcost=0;
//初始,U={u};
for(i=1;
++i)//选择其余G.vexnum-1个顶点
k=Minimum(closeEdge,G.vexnum);
//求出T的下一个结点:
第k顶点
//此时closeEdge[k].lowcost=MIN{closeEdge[vi].lowcost|closeEdge[vi].lowcost>
0,vi∈V-U}
cout<
'
closeEdge[k].adjvex<
'
G.vexs[k]<
//输出生成树的边
totalCost+=closeEdge[k].lowcost;
closeEdge[k].lowcost=0;
//第k顶点并入U集
if(G.arcs[k][j].adj<
closeEdge[j].lowcost)//新顶点并入U后重新选择最小边
{
strcpy(closeEdge[j].adjvex,G.vexs[k]);
}
\n|总代价:
totalCost<
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^/\n"
}//MiniSpanTree
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编程 参考 构成 可以 城市 连接 最小 生成