图中两个结点的最短路径的求解Word文档格式.docx
《图中两个结点的最短路径的求解Word文档格式.docx》由会员分享,可在线阅读,更多相关《图中两个结点的最短路径的求解Word文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
(2)初始图的结构;
(3)向图中插入元素;
(4)查找某元素在图顶点中的位置;
(5)创建邻接表;
(6)寻找寻找最短路径;
(7)输出;
4、本实验实现在图中找到两个顶点之间的最短路径。
5、输入及输出示例:
二概要设计
基本操作
(1)、voidInitGraph(MGraph*G)
操作结果:
初始图。
(2)、voidInsertGraph(MGraph*G,inti,VertexTypee)
初始条件:
图G存在。
将e插入到图中的第i个位置。
(3)、intLocate(MGraphG,VertexTypev1)
找到V1在图中的位置。
(4)、voidCreateUND(MGraph*G)
用邻接矩阵和邻接表表示图
(5)、voidShortestPath(MGraphG,intv0,int**p,int*D)
寻找图G中顶点之间的最短路径
(6)、voidPint(MGraphG)
输出邻接矩阵。
三详细设计
1、每个模块:
(1)初始图
voidInitGraph(MGraph*G)/*初始图*/
{inti,nu,mu;
printf("
\n输入顶点的个数和(边)弧的个数:
"
);
scanf("
%d%d"
&
nu,&
mu);
G->
arcs=(ArcCell**)malloc(nu*sizeof(ArcCell*));
for(i=0;
i<
nu;
i++)/*分配邻接矩阵空间*/
arcs[i]=(ArcCell*)malloc(nu*sizeof(ArcCell));
vexs=(VertexType*)malloc(nu*sizeof(VertexType));
/*分配顶点空间*/
vexnum=nu;
G->
arcnum=mu;
/*图的顶点数和边数*/
}
(2)、将e插入到图中的第i个位置
voidInsertGraph(MGraph*G,inti,VertexTypee)
{if(i<
0||i>
vexnum)return;
strcpy(G->
vexs[i].data,e.data);
}
(3)、找到V1在图中的位置
intLocate(MGraphG,VertexTypev1)/*确定v1在图顶点中的位置*/
{inti;
G.vexnum;
i++)
if(strcmp(v1.data,G.vexs[i].data)==0)returni;
return-1;
(4)、用邻接矩阵和邻接表表示图
voidCreateUND(MGraph*G)/*采用数组(邻接矩阵)和邻接表表示无向图*/
{inti,j,k,*p,w;
VertexTypev1,v2;
p=(int*)malloc(G->
vexnum*sizeof(int));
10;
i++)p[i]=0;
vexnum;
++i)/*初始邻接表*/
{for(j=0;
j<
++j)
arcs[i][j].adj=ING;
for(k=0;
k<
arcnum;
++k)
{printf("
\n输入第%d条(边)弧相对的两个顶点值:
\n"
k+1);
%s%s"
v1.data,v2.data);
/*输入相邻的两个点值*/
输入它们的权值:
"
%d"
w);
i=Locate(*G,v1);
j=Locate(*G,v2);
/*用i和j来确定它们的位置*/
arcs[i][j].adj=w;
}
(5)、寻找图G中顶点之间的最短路径
voidShortestPath(MGraphG,intv0,int**p,int*D)
/*对顶点V0到其余顶点v的最短路径p[v]及其带权长度D[v]若p[v][w]为1,则w是从V0到W当前求得最短路径上的顶点,
final[v]为1,当且仅当v属于S,即已经求得从v0到v的最短路*/
{intv,u,i,w,min;
int*final;
final=(int*)malloc(G.vexnum*sizeof(int));
/*分配空间*/
for(v=0;
v<
++v){
final[v]=0;
D[v]=G.arcs[v0][v].adj;
/*初始化*/
for(w=0;
w<
++w)p[v][w]=0;
/*设空路径*/
if(D[v]<
ING){p[v][v0]=1;
p[v][v]=1;
}/*v到v0有路径*/
D[v0]=0;
final[v0]=1;
/*初始化,V0顶点属于S集*/
for(i=1;
i++){/*其余G.vexnum-1个顶点*/
min=ING;
for(w=0;
++w)/*求出矩阵这一行的最小值*/
if(!
final[w])/*W顶点属于V-S中*/
if(D[w]<
min){v=w;
min=D[w];
final[v]=1;
/*离V0顶点最近的V加入S集*/
++w)/*更新当前最短路径及距离*/
final[w]&
&
(min+G.arcs[v][w].adj<
D[w])){/*不是最小的,修改D[w],P[w]*/
D[w]=min+G.arcs[v][w].adj;
for(u=0;
u<
u++)
p[w][u]=p[v][u];
p[w][w]=1;
}
free(final);
(6)、输出邻接矩阵
voidPint(MGraphG)/*输出邻接矩阵*/
{inti,j;
{
for(j=0;
j++)
{if(G.arcs[i][j].adj!
=ING)
printf("
\t%d"
G.arcs[i][j].adj);
else{if(i==j)printf("
\t0"
elseprintf("
\t∞"
}
(7)、主函数
voidmain()
{MGraphG;
VertexTypee;
inti,j;
int**p;
int*D;
InitGraph(&
G);
p=(int**)malloc(G.vexnum*sizeof(int*));
p[i]=(int*)malloc(G.vexnum*sizeof(int));
D=(int*)malloc(G.vexnum*sizeof(int));
顶点值:
\n"
++i)/*给图顶点向量付值*/
{scanf("
%s"
e.data);
InsertGraph(&
G,i,e);
CreateUND(&
/*构造图结构*/
邻接矩阵为:
Pint(G);
/*输出邻接矩阵*/
{ShortestPath(G,i,p,D);
/*调用最短函数*/
for(j=0;
if(i!
=j)
%s到%s的最短路为%d\n"
G.vexs[i].data,G.vexs[j].data,D[j]);
\n\n"
}
getch();
2、完整函数
#include<
stdio.h>
stdlib.h>
conio.h>
string.h>
#defineING9999
typedefstructArcCell{
intadj;
/*顶点关系类型,用1表示相邻,0表示不相邻*/
}ArcCell,**AdjMatrix;
/*邻接矩阵*/
typedefstructtype{
chardata[3];
/*顶点值*/
}VertexType;
typedefstruct{
VertexType*vexs;
/*顶点向量*/
AdjMatrixarcs;
/*邻接矩阵*/
intvexnum,arcnum;
/*图的顶点数和边数*/
}MGraph;
五、实验总结
这次数据结构课程设计的制作使我对数据结构和C语言的理解更加深刻,也使我认识到了自己很多不足之处。
这次程序设计使我认识到,要做成编写一个完整的程序绝对不是一件简单的事情,不单要掌握基础知识更要勇于实践,不单要舍得花费时间更要用心去完成它。
无论是编写程序还是完成现实生活中的其他事情,我们都必须按部就班地从点滴做起,逐步完成。
不但要完成更要做到尽善尽美。
教师评语:
实验成绩:
指导教师签名:
批阅日期: