图的最少连通路径集课程设计解读文档格式.docx
《图的最少连通路径集课程设计解读文档格式.docx》由会员分享,可在线阅读,更多相关《图的最少连通路径集课程设计解读文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
1.2课设内容
给定一个无向图,代表一个特定的网络连接关系,现根据这个图求出一组路径,路径中包含节点仅一次,并且途中所有节点至少属于其中一条路径,要求求出的路径集合中包含的路径数量最少。
1.3课设要求
1.利用所学知识,设计相应的数据结构
2.熟练运用开发环境
3.完成软件的设计与编程
4.熟练掌握基本的调试方法
5.提交符合课程设计规范的报告
2系统功能结构模块图
2.1功能模块图
本程序由以下几个模块构成
图2.1系统模块
2.2生成树模块的具体演示操作
1.普利姆算法实现过程演示(寻找最小权值的过程):
2.3模块功能说明
1.建图模块
通过输入的节点数和弧数来控制输入的节点数和弧数,并通过数组一个一维数组储存顶点和一个二维数组储存弧信息,边信息的储存是一个领接矩阵,领接矩阵的数为无穷大或者为相应的权值,相应流程图如下:
2.生成树模块
此模块采用普利姆算法实现,此算法实现的建立在顶点定位模块和寻找最小权值模块的基础上,首先定位首个顶点(该顶点是程序默认的一维数组的第一个元素),通过定位模块找出顶点在一维数组中的位置,再通过辅助数组与寻找最小权值模块进行比较后将该顶点在领接矩阵中的值赋给辅助数组,最后通过辅助数组用同样的方式找出图中剩余顶点相连的弧的最小权值,然后打印出所有的顶点的最小边即最小生成树实现流程图如下:
3.顶点定位模块:
程序默认顶点是从第一个顶点开始的,通过(strcmp(u,G.vexs[i])判断出输入的顶点是否是属于G中的元素,如果是则返回该顶点在一维数组中的具体位置,如果不在G中这返回-1.实现流程图如下:
4.寻找最小权值模块:
该模块同样借助与辅助数组进行,首先找到一个权值不为0的顶点,利用一个for(j=i+1;
j<
G.vexnum;
j++)控制条件进行顶点的移动比较,且通过if(SZ[j].lowcost>
0)判断权值是否符合条件又利用if(min>
SZ[j].lowcost)进而筛选出一个顶点的最小权值,并返回该顶点在数组中的位置K返回到生成树模块。
3测试/运行结果
1.例如输入图2.2生成树模块具体实现的演示操作的第一步图后的运行结果如下:
运行结果与图2.2生成树模块具体实现的演示操作第三步结果完全吻合。
2.例如输入如下无向图:
图3.1的预期生成树为:
输入图3.1,运行结果如下:
运行结果和图3.1的预期生成树完全符合。
参考文献
[1]严蔚敏,吴伟明.数据结构(c语言版)[M].北京:
清华大学出版社,2006
[2]吕国英,算法设计与分析[M].北京:
[3]徐宝文,李志.C程序设计语言[M].北京:
机械工业出版社,2004
[4]宁正元,王秀丽,林大辉.算法与数据结构习题精解和实验指导.北京:
清华大学出版社,2007年1月
附录
#include<
stdio.h>
stdlib.h>
malloc.h>
string.h>
limits.h>
#defineMAX_VERTEX_NUM20//最大顶点个数
#defineINFINITYINT_MAX//用整型最大值代替∞
typedefintVRType;
typedefcharInfoType;
typedefcharVertexType[MAX_VERTEX_NUM];
//邻接矩阵的数据结构
typedefstruct
{
VRTypeadj;
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
//图的数据结构
VertexTypevexs[MAX_VERTEX_NUM];
//顶点向量
AdjMatrixarcs;
//邻接矩阵
intvexnum,//图的当前顶点数
arcnum;
//图的当前弧数
}MGraph;
//记录从顶点集U到V-U的代价最小的边的辅助数组定义
VertexTypeadjvex;
VRTypelowcost;
}minside[MAX_VERTEX_NUM];
//若G中存在顶点u,则返回该顶点在图中位置;
否则返回-1。
intLocateVex(MGraphG,VertexTypeu)
inti;
for(i=0;
i<
++i)
if(strcmp(u,G.vexs[i])==0)
returni;
return-1;
}
//采用数组(邻接矩阵)表示法,构造无向网G。
intCreateAN(MGraph*G)
inti,j,k,w;
VertexTypeva,vb;
printf("
请输入无向网G的顶点数,边数:
(空格区分)\n"
);
scanf("
%d%d"
&
(*G).vexnum,&
(*G).arcnum);
请输入%d个顶点的值:
\n"
(*G).vexnum);
(*G).vexnum;
++i)//构造顶点向量
scanf("
%s"
(*G).vexs[i]);
++i)//初始化邻接矩阵
for(j=0;
++j)
(*G).arcs[i][j].adj=INFINITY;
//网初始化为无穷大
请输入%d条边的顶点1顶点2权值(以空格作为间隔):
\n"
(*G).arcnum);
for(k=0;
k<
(*G).arcnum;
++k)
{
%s%s%d"
va,vb,&
w);
i=LocateVex(*G,va);
j=LocateVex(*G,vb);
(*G).arcs[i][j].adj=(*G).arcs[j][i].adj=w;
//无向图的反向弧
}
return1;
//求领接顶点权值最小边
intminimum(minsideSZ,MGraphG)
inti=0,j,k,min;
while(!
SZ[i].lowcost)
i++;
min=SZ[i].lowcost;
//第一个不为0的值
k=i;
for(j=i+1;
j++)
if(SZ[j].lowcost>
0)
if(min>
SZ[j].lowcost)
{
min=SZ[j].lowcost;
k=j;
}
returnk;
//用普里姆算法从第u个顶点出发构造网G的最小生成树T,输出T的各条边
voidMiniSpanTree_PRIM(MGraphG,VertexTypeu)
inti,j,k;
minsideclosedge;
k=LocateVex(G,u);
for(j=0;
++j)//辅助数组初始化
if(j!
=k)
{
strcpy(closedge[j].adjvex,u);
closedge[j].lowcost=G.arcs[k][j].adj;
}
closedge[k].lowcost=0;
//初始,U={u}
最小生成树的各条边为:
for(i=1;
++i)
{//选择其余G.vexnum-1个顶点
k=minimum(closedge,G);
//求出T的下一个结点:
第K顶点
printf("
(%s-%s)\n"
closedge[k].adjvex,G.vexs[k]);
//输出生成树的边
closedge[k].lowcost=0;
//第K顶点并入U集
if(G.arcs[k][j].adj<
closedge[j].lowcost)
{//新顶点并入U集后重新选择最小边
strcpy(closedge[j].adjvex,G.vexs[k]);
closedge[j].lowcost=G.arcs[k][j].adj;
voidmain()
MGraphG;
>
请输入一个连通图,否则程序无效!
<
CreateAN(&
G);
MiniSpanTree_PRIM(G,G.vexs[0]);
课程设计总结:
经过几天的课程设计,发现了自己很多需要改进的地方,也了解到了一些思考问题的方法。
有很多知识都是课堂上所学不到的,不论是请教同学还是自己翻阅资料,收获了知识就是对于自己的一种鼓舞。
对于学习计算机来说,算法和自己的编程能力都是很重要的。
而这些恰恰是我所欠缺的。
我认为,在以后的学习中,应该多加练习,认真思考学习的方法,提高自己解决问题的能力。
领会一些经典算法所包含的思想内容,在平时多总结,在学习中要细心,彻底掌握所学知识。
课设既是对于自己的一次考察,也是对于自己的能力提高的一个机会,不管完成的好与坏,只要用心去做了,就总会有收获。
只有努力去完成自己应该做的事,才能在最后懂得努力与坚持的价值。
指导教师评语:
有需要做课设的同学可以加QQ:
676501866(注明求课设)
指导教师(签字):
年月日
课程设计成绩