《数据结构课程设计》最短路径问题实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录
一、概述 0
二、系统分析 0
三、概要设计 (1)
四、详细设计 (4)
建立图的存储结构 (4)
单源最短路径 (5)
任意一对顶点之间的最短路径 (5)
五、运行与测试 (5)
参考文献 (7)
附录 (8)
交通咨询系统设计(最短路径问题)一、概述
在交通网络日益发达的今天,针对人们关心的各种问题,利用计算机建立一个交通咨询系统。在系统中采用图来构造各个城市之间的联系,图中顶点表示城市,边表示各个城市之间的交通关系,所带权值为两个城市间的耗费。这个交通咨询系统可以回答旅客提出的各种问题,例如:如何选择一条路径使得从A城到B城途中中转次数最少;如何选择一条路径使得从A城到B城里程最短;如何选择一条路径使得从A城到B城花费最低等等的一系列问题。
二、系统分析
设计一个交通咨询系统,能咨询从任何一个城市顶点到另一城市顶点之间的最短路径(里程)、最低花费或是最少时间等问题。对于不同的咨询要求,可输入城市间的路程、所需时间或是所需费用等信息。
针对最短路径问题,在本系统中采用图的相关知识,以解决在实际情况中的最短路径问题,本系统中包括了建立图的存储结构、单源最短问题、对任意一对顶点间最短路径问题三个问题,这对以上几个问题采用了迪杰斯特拉算法和弗洛伊德算法。并未本系统设置一人性化的系统提示菜单,方便使用者的使用。
三、概要设计
可以将该系统大致分为三个部分:
①建立交通网络图的存储结构;
②解决单源最短路径问题;
③实现两个城市顶点之间的最短路径问题。
迪杰斯特拉算法流图:
弗洛伊德算法流图:
四、详细设计
建立图的存储结构
定义交通图的存储结构。邻接矩阵是表示图形中顶点之间相邻关系的矩阵。设G=(V,E)是具有n 个顶点的图,则G 的邻接矩阵是具有如下定义的n 阶方阵。
⎪⎩
⎪⎨⎧∞>∈<=,其他情况或或,若0E(G)V ,V )V ,(V ],[j i j i ij W j i A 注:一个图的邻接矩阵表示是唯一的!其表示需要用一个二维数组存储顶点之间相邻关系的邻接矩阵并且还需要用一个具有n 个元素的一维数组来存储顶点信息(下标为i 的元素存储顶点i V 的信息)。 邻接矩阵的存储结构:
#define MVNum 100
61 45 56 26 64 74 76 13 17 32 5 4 7 3 6 1 2 704 812 511 2368 1385 1579 695 349 651 成都 广州 西安 北京 郑州 上海 徐州
2553 1
7 6 4 2 3 5
华大学出版社.
【2】《数据结构课程设计》苏仕华.极械工业出版社.
附录
#include<>
#include<>
#define MVNum 100
#define Maxint 32767
enum boolean{FALSE,TRUE};
typedef char VertexType;
typedef int Adjmatrix;
typedef struct{
VertexType vexs[MVNum];
Adjmatrix arcs[MVNum][MVNum];
}MGraph;
int D1[MVNum],p1[MVNum];
int D[MVNum][MVNum],p[MVNum][MVNum];
void CreateMGraph(MGraph * G,int n,int e) {
int i,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");
}
void Dijkstra(MGraph *G,int v1,int n)
{
int D2[MVNum],p2[MVNum];
int v,i,w,min;
enum boolean S[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"); } } void Floyd(MGraph *G,int n) { int i,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]; }