数据结构--交通咨询系统

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档