数据结构课程设计最短路径问题实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录
交通咨询系统设计(最短路径问题)一、概述
在交通网络日益发达的今天,针对人们关心的各种问题,利用计算机建立一个交通咨询系统。在系统中采用图来构造各个城市之间的联系,图中顶点表示城市,边表示各个城市之间的交通关系,所带权值为两个城市间的耗费。这个交通咨询系统可以回答旅客提出的各种问题,例如:如何选择一条路径使得从A城到B城途中中转次数最少;如何选择一条路径使得从A城到B城里程最短;如何选择一条路径使得从A城到B城花费最低等等的一系列问题。
二、系统分析
设计一个交通咨询系统,能咨询从任何一个城市顶点到另一城市顶点之间的最短路径(里程)、最低花费或是最少时间等问题。对于不同的咨询要求,可输入城市间的路程、所需时间或是所需费用等信息。
针对最短路径问题,在本系统中采用图的相关知识,以解决在实际情况中的最短路径问题,本系统中包括了建立图的存储结构、单源最短问题、对任意一对顶点间最短路径问题三个问题,这对以上几个问题采用了迪杰斯特拉算法和弗洛伊德算法。并未本系统设置一人性化的系统提示菜单,方便使用者的使用。
三、概要设计
可以将该系统大致分为三个部分:
① 建立交通网络图的存储结构;
② 解决单源最短路径问题;
③ 实现两个城市顶点之间的最短路径问题。
四、详细设计
建立图的存储结构
定义交通图的存储结构。邻接矩阵是表示图形中顶点之间相邻关系的矩阵。设G=(V,E)是具有n个顶点的图,则G的邻接矩阵是具有如下定义的n阶方阵。
注:一个图的邻接矩阵表示是唯一的!其表示需要用一个二维数组存储顶点之间相邻关系的邻接矩阵并且还需要用一个具有n个元
素的一维数组来存储顶点信息(下标为i的元素存储顶点
V的信息)。
i
邻接矩阵的存储结构:
附录
#include<>
#include<>
#defineMVNum100
#defineMaxint32767
enumboolean{FALSE,TRUE}; typedefcharVertexType;
typedefintAdjmatrix;
typedefstruct{
VertexTypevexs[MVNum];
Adjmatrixarcs[MVNum][MVNum];
}MGraph;
intD1[MVNum],p1[MVNum];
intD[MVNum][MVNum],p[MVNum][MVNum]; voidCreateMGraph(MGraph*G,intn,inte)
{
inti,j,k,w;
for(i=1;i<=n;i++)
G->vexs[i]=(char)i;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
G->arcs[i][j]=Maxint;
printf("输入%d条边的及w:\n",e);
for(k=1;k<=e;k++){
scanf("%d,%d,%d",&i,&j,&w);
G->arcs[i][j]=w;
}
printf("有向图的存储结构建立完毕!\n"); }
voidDijkstra(MGraph*G,intv1,intn)
{
intD2[MVNum],p2[MVNum];
intv,i,w,min;
enumbooleanS[MVNum];
for(v=1;v<=n;v++){
S[v]=FALSE;
D2[v]=G->arcs[v1][v];
if(D2[v] p2[v]=v1; else p2[v]=0; } D2[v1]=0;S[v1]=TRUE; for(i=2;i min=Maxint; for(w=1;w<=n;w++) if(!S[w]&&D2[w] {v=w;min=D2[w];} S[v]=TRUE; for(w=1;w<=n;w++) if(!S[w]&&(D2[v]+G->arcs[v][w] D2[w]=D2[v]+G->arcs[v][w]; p2[w]=v; } } printf("路径长度路径\n"); for(i=1;i<=n;i++){ printf("%5d",D2[i]); printf("%5d",i);v=p2[i]; while(v!=0){ printf("<-%d",v); v=p2[v]; } printf("\n"); } } voidFloyd(MGraph*G,intn) { inti,j,k,v,w; for(i=1;i<=n;i++) for(j=1;j<=n;j++) { if(G->arcs[i][j]!=Maxint) p[i][j]=j; else p[i][j]=0; D[i][j]=G->arcs[i][j]; } for(k=1;k<=n;k++) { for(i=1;i<=n;i++) for(j=1;j<=n;j++) { if(D[i][k]+D[k][j]