数据结构--交通咨询系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录
1 概述 (2)
1.1 问题描述 (2)
1.2 实现意义 (2)
2 系统分析 (2)
2.1 需求分析 (2)
2.1.1程序的功能 (2)
2.1.2输入输出的要求 (2)
2.2 设计思想 (2)
2.3 设计要求 (3)
3 概要设计 (3)
3.1用邻接矩阵建立交通网络模块 (3)
3.2 查询任意两个顶点之间的最短路径 (4)
3.3 查询一个城市到其他所有城市的最短路径 (5)
4 详细设计 (5)
4.1 用邻接矩阵构造图结构函数CreateMGraph() (5)
4.2 费洛伊德Floyd() (6)
4.3 迪杰斯特拉Dijkstra() (6)
4.4 主要函数流程图及其函数调用 (7)
4.4.1 主要函数流程图 (7)
4.4.2 一个城市到其他城市的路径调用 (8)
4.4.3 任意两个城市之间路径调用 (8)
5 运行与测试 (8)
5.1 有向图存储结构的建立模块的输出 (9)
5.2 单源路径迪杰斯特拉算法模块的输出 (10)
5.3 费洛伊德算法模块的输出 (10)
6 总结与心得 (10)
参考文献 (11)
附录 (11)
1 概述
1.1 问题描述
在交通网络非常发达,交通工具和交通方式不断更新的今天,人们在出差、旅游或做其它出行时,不仅关心节省费用,而且对里程和所需时间等问题也感兴趣。对于这样一个人们关心的问题,可用一个图结构来表示交通网络系统,利用计算机建立一个交通咨询系统。图中顶点表示城市之间的交通关系。这个交通系统可以回答旅客提出的各种问题。比如任意一个城市到其他城市的最短路径,任意两个城市之间的最短路径问题。
1.2 实现意义
便于人们的日常出行,且更好地满足了用户的出行需求。这种最短路径问题的计算方法既简单又便于实现,同时大大提高了计算机的运行速率。
2 系统分析
2.1 需求分析
2.1.1程序的功能
(1)用户自己可以建立不同的路径之间的关系网(2)可以查询某个城市到达其余各城市的最短路径。(3)可以任一查询两个城市之间的最短路径。
2.1.2输入输出的要求
在刚进入主界面后系统提示输入建立交通网络储存结构,输入顶点个数和和边数为整数不能输入其他字符,随后系统提示输入边与边之间的关系分别为i,j,w表示边之间的距离。然后进入查询页面,输入整数1,2,0分别表示你所要查询的功能:一个城市至其他所有城市的最短路径查询、任意两个城市之间的最短路径查询、退出程序。不能输入其他字符否则不能执行操作。在整个操作都是用整数表示城市。
2.2 设计思想
用邻接矩阵来存储交通网络图的信息,运用迪杰斯特拉算法实现图上单源最短路径问题,然后运用费洛伊德算法实现图中任意一对顶点间最短路径问题,这样就会实现交通咨询系统设计的问题。
2.3 设计要求
该交通咨询系统要完成城市网络图的存储,并要实现求任意一个城市顶点到其他城市顶点的最短路径问题,还要实现任意两个城市顶点间的最短路径问题。故设计要分成三部分,一是建立交通网络图的存储结构;二是解决单源路径问题;最后再实现两个城市之间的最短路径问题。
3 概要设计
3.1用邻接矩阵建立交通网络模块
\
3-2-1 建立邻接矩阵
注:用户构建交通网络时,输入顶点个数n,边数e。然后在分别输入每个顶点i和j之间的
距离w。程序将自动根本用户所输入的构建邻接矩阵。
3.2 查询任意两个顶点之间的最短路径
3-2-2 费洛伊德算法
注:用户输入他所需要查询的城市的起点v和终点w,程序利用费洛伊德算法依次输出起点v到终点w所经过的顶点。
3.3 查询一个城市到其他所有城市的最短路径
3-2-3 迪杰斯特拉算法
注:用户输入他所需要查询的城市的起点v,程序将会调用迪杰斯特拉算法,用S保存经过的顶点,最终会输出用户所需要查询的顶点v到其他所有顶点的最短路径。
4 详细设计
4.1 用邻接矩阵构造图结构函数CreateMGraph()
其中vexs[MVNum]保存顶点信息,arcs[MVNum][MVNum]用于保存边与边之间的信息。在构建时通过输入的边数i,j作为矩阵的行、列确定顶点的出度和入度。用邻接矩阵方法存储图,很容易确定图的任意两个顶点是否是有边相连,因此用邻接矩阵对有利于后面费洛伊德算法和迪杰斯特拉算法。
数据类型定义:
typedef struct
{
VertexType vexs[MVNum];
Adjmatrix arcs[MVNum][MVNum];
}MGraph;
邻接矩阵的程序代码:
for(k=1;k<=e;k++) //读入e条边建立邻接矩阵
{ printf(" 第%d条边的信息:",k);
scanf("%d,%d,%d",&i,&j,&w);
G->arcs[i][j]=w;
G->arcs[j][i]=w;
}
4.2 费洛伊德Floyd()
费洛伊德算法对求任意两个顶点之间的路径较优。用邻接矩阵保存图存储后,另外需要存一个二维数组A存放当前顶点之间的最短路径长度。分量A[i][j]表示当前顶点i到j的最短路径长度。费洛伊德算法的基本思维是递推产生一个矩阵序列A0,A1,A2,….Ak,…An,其中Ak[i][j]表示从顶点到vi到顶点vj 的路径上所经过的顶点编号不大于k的最短路径长度。
A[i][j]=cost[i][j]
A(k+1)[i][j]=min{Ak[i][j],Ak[i+1][k+1]+Ak[k+1][j]}
费洛伊德主要算法,若Ak[i][j]已求出,顶点i到顶点k+1的路径长度为Ak[i][k+1],顶点路径长度为Ak[i][j],顶点k+1到顶点j的路径长度为Ak[k+1][j],如果此时Ak[i][k+1]+Ak[k+1][j]< Ak[i][j],则将原来的顶点i到顶点j的路径改为顶点,否则不需要修改顶点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] { D[i][j]=D[i][k]+D[k][j]; //修改长度 P[i][j]=P[i][k]; } } } 4.3 迪杰斯特拉Dijkstra() 迪杰斯特拉算法对求一个顶到到其他所有顶点的路径较优。初始时,S中只包含原点,顶点v到自己的距离为0,D中包含出v外的其他顶点,v到D中顶点u的距离为边上的权值。从D中选取一个顶点k,顶点v到顶点k的距离最小,然后把顶点k加入到S中,该选定的距离就是v到k的最短路径长度。以顶点k为新考虑的中间点,修改顶点v到U中各顶点的距离,若从原点v到顶点u的距离比原来的距离(不经过k)的距离看,短,则修改顶点u的距离值,修改后的距离值为顶点v到顶点k的距离加上边 迪杰斯特拉的算法: D2[v1]=0;S[v1]=1; //原点编号放入s中 for(i=2;i