图论编程题3参考构成可以使n个城市连接的最小生成树.docx

上传人:b****5 文档编号:4965054 上传时间:2022-12-12 格式:DOCX 页数:13 大小:77.17KB
下载 相关 举报
图论编程题3参考构成可以使n个城市连接的最小生成树.docx_第1页
第1页 / 共13页
图论编程题3参考构成可以使n个城市连接的最小生成树.docx_第2页
第2页 / 共13页
图论编程题3参考构成可以使n个城市连接的最小生成树.docx_第3页
第3页 / 共13页
图论编程题3参考构成可以使n个城市连接的最小生成树.docx_第4页
第4页 / 共13页
图论编程题3参考构成可以使n个城市连接的最小生成树.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

图论编程题3参考构成可以使n个城市连接的最小生成树.docx

《图论编程题3参考构成可以使n个城市连接的最小生成树.docx》由会员分享,可在线阅读,更多相关《图论编程题3参考构成可以使n个城市连接的最小生成树.docx(13页珍藏版)》请在冰豆网上搜索。

图论编程题3参考构成可以使n个城市连接的最小生成树.docx

图论编程题3参考构成可以使n个城市连接的最小生成树

目录

一.需求分析2

1.1设计的任务2

1.2程序所能达到的功能2

1.3程序执行命令2

二.概要设计3

2.1抽象数据类型结构体数组的定义:

3

2.2程序模块4

2.3流程图4

三.详细设计5

3.1数据类型定义5

3.2程序主要模块5

四.调试分析和测试结果8

4.1调试分析8

4.2测试结果9

五.总结10

六.参考文献10

七.致谢11

八.附录11

 

构造可以使N个城市连接的最小生成树

一.需求分析

1.1设计的任务

给定一个地区的n个城市间的距离网,用Prim算法或Kruskal算法建立最小生成树,并计算得到的最小生成树的代价。

1.2程序所能达到的功能

1.2.1城市间的道路网采用邻接矩阵表示,邻接矩阵的存储结构定义采用课本中给出的定义,若两个城市之间不存在道路,则将相应边的权值设为自己定义的无穷大值。

1.2.2显示出城市间道路网的邻接矩阵。

1.2.3最小生成树中包括的边及其权值,并显示得到的最小生成树的总代价。

1.3程序执行命令

输入城市数、道路数→输入城市名→输入道路信息→执行Kruskal算法→执行Prim算法→输出最小生成树

 

二.概要设计

2.1抽象数据类型结构体数组的定义:

#ifndefADJACENCYMATRIXED//防止该头文件被重复引用

#defineADJACENCYMATRIXED//而引起的数据重复定义

#defineINFINITY32767//最大值∞

#defineMAX_VERTEX_NUM20//最大顶点个数

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&G);//释放堆内存上动态申请的空间

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

求下一个城市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)****************

StatusLocateVex(MGraphG,VertexTypev);

{

while(strcmp(G.vexs[i],v)){i++;}

返回i;

}

****************CreateUDN*************************

{

输入城市数、道路数;

for(i=0;i<城市数;++i)输入城市名;

for(i=0;i<城市数;++i)

for(j=0;j<城市数;++j)

初始化邻接矩阵:

道路值=INFINITY;

for(i=0;i<城市数;++i)

for(j=0;j<城市数;++j)

输入两个城市表示道路,输入道路值;

}

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;i

{

在其余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

#include

#include

#include

#include"TypeDefine.h"

#include"AdjacencyMatrix.h"

#include"InitializeFunction.h"

#include"MiniSpanTree_KRUSKAL.h"

#include"MiniSpanTree_PRIM.h"

#include"DisplayNet.h"

#include"DeleteInfo.h"

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&G);//释放堆内存上动态申请的空间

intmain(intargc,char*argv[])

{

CreateGraph(G);

DisplayNet(G);

MiniSpanTree_KRUSKAL(G);

MiniSpanTree_PRIM(G,G.vexs[0]);

DeleteInfo(G);

cout<

system("pause");

return0;

}

//intializeFunction.h

StatusCreateDG(MGraph&G){return0;};

StatusCreateDN(MGraph&G){return0;};

StatusCreateUDG(MGraph&G){return0;};

StatusCreateUDN(MGraph&G);

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");

printf("|请选择:

[]\b\b");

scanf("%d",&G.kind);

printf("+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");*/

switch(G.kind)

{

caseDG:

returnCreateDG(G);//构造有向图G

caseDN:

returnCreateDN(G);//构造有向网G

caseUDG:

returnCreateUDG(G);//构造无向图G

caseUDN:

returnCreateUDN(G);//构造无向网G

default:

returnERROR;

}

}//CreateGraph

StatusCreateUDN(MGraph&G)

{

//采用数组(邻接矩阵)表示法,构造图G.

inti,j,k;

VertexTypev1,v2;

VRTypew;

printf("构造可以使N个城市连接的最小生成树\n");

printf("请输入城市数、道路数(至少6个城市,10条道路):

");

cin>>G.vexnum>>G.arcnum;

for(i=0;i

{

printf("请输入第%d个城市名(共%d个):

",i+1,G.vexnum);

cin>>G.vexs[i];

}

for(i=0;i

{

for(j=0;j

{

G.arcs[i][j].adj=INFINITY;

//G.arcs[i][j].info=NULL;

}

}

printf("请输入一条道路连接的两个城市名及权值:

\n");

for(k=0;k

{

printf("共%3d条道路,第%3d条道路:

",G.arcnum,k+1);

cin>>v1>>v2>>w;//输入一条边依附的顶点及权值

i=LocateVex(G,v1);//确定v1、v2在G中的位置

j=LocateVex(G,v2);

G.arcs[i][j].adj=w;//弧的权值

G.arcs[j][i]=G.arcs[i][j];//置的对称弧

}

returnOK;

}//CreateUDN

//MiniSpanTreePRIM.h

StatusMinimum(closedgecloseEdge,intn)

{

inti,flag,minTemp=INFINITY;

for(i=0;i

{

if((closeEdge[i].lowcost!

=0)&&(minTemp>closeEdge[i].lowcost))

{

minTemp=closeEdge[i].lowcost;

flag=i;

}

}

returnflag;

}

voidMiniSpanTree_PRIM(MGraphG,VertexTypeu)

{

//用普里姆算法从第u个顶点出发构造网G的最小生成树T,输出T的各条边。

//记录从顶点集U到V-U的代价最小的边的辅助数组定义见"AdjacencyMatrix.h"

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;

}

}

cout<<"\n\n+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\\\n";

cout<<"|用Prim算法求最小生成树的各条边依次为:

\n-----";

closeEdge[k].lowcost=0;//初始,U={u};

for(i=1;i

{

k=Minimum(closeEdge,G.vexnum);//求出T的下一个结点:

第k顶点

//此时closeEdge[k].lowcost=MIN{closeEdge[vi].lowcost|closeEdge[vi].lowcost>0,vi∈V-U}

cout<<'<'<';//输出生成树的边

totalCost+=closeEdge[k].lowcost;

closeEdge[k].lowcost=0;//第k顶点并入U集

for(j=0;j

{

if(G.arcs[k][j].adj

{

strcpy(closeEdge[j].adjvex,G.vexs[k]);

closeEdge[j].lowcost=G.arcs[k][j].adj;

}

}

}

cout<<"\n|总代价:

"<

cout<<"+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^/\n";

}//MiniSpanTree

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 军事

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1