校园旅游信息管理系统
1.1 项目需求分析
在旅游景区, 经常会遇到游客打听从一个景点到另一个景点的最短路径和最短距离, 这 类游客不喜欢按照导游图的线路来游览, 而是挑选自己感兴趣的景点游览。 为于帮助这类游 客信息查询, 就需要计算出所有景点之间最短路径和最短距离。 算法采用迪杰斯特拉算法或 弗洛伊德算法均可。 建立一个景区旅游信息管理系统, 实现的主要功能包括制订旅游景点导 游线路策略和制订景区道路铺设策略。
任务中景点分布是一个无向带权连通图,图中边的权值是景点之间的距离。
1)景区旅游信息管理系统中制订旅游景点导游线路策略,首先通过遍历景点,给出一个入 口景点,建立一个导游线路图, 导游线路图用有向图表示。遍历采用深度优先策略,这也比 较符合游客心理。
(2)为了使导游线路图能够优化,可通过拓朴排序判断图中有无回路,若有回路,则 打印输出回路中的景点,供人工优化。
(3)在导游线路图中,还为一些不愿按线路走的游客提供信息服务,比如从一个景点 到另一个景点的最短路径和最短距离。 在本线路图中将输出任意景点间的最短路径和最短距 离。
(4)在景区建设中,道路建设是其中一个重要内容。道路建设首先要保证能连通所有 景点, 但又要花最小的代价, 可以通过求最小生成树来解决这个问题。 本任务中假设修建道 路的代价只与它的里程相关。
因此归纳起来,本任务有如下功能模块:
创建景区景点分布图;
输出景区景点分布图(邻接矩阵) 输出导游线路图; 判断导游线路图有无回路;
求两个景点间的最短路径和最短距离; 输出道路修建规划图。
主程序用菜单选项供用户选择功能模块。
叮叮小文库
1.2项目设计流程
1.2.1项目总体框架
2
叮叮小文库
122项目数据结构
#ifndef SUCCESS
#defi ne SUCCESS 1
#en dif
#ifndef FAILURE #defi ne FAILURE 0
#en dif #ifndef INF
#defi ne INF
0x3f3fffff #en dif
#ifndef MAXNUM #defi ne MAXNUM 20
#en dif
typedef bool STATUS;
typedef char VERTEXTYPE[MAXNUM][11]; typedef int ADJMATRIX[MAXNUM][MAXNUM]; 据类型
typedef struct GRAPH { VERTEXTYPE Vexs; ADJMATRIX Arcs; int VexNum; int ArcNum; }*PGRAPH;
typedef struct CLOSEDGE {
VERTEXTYPE Vexs; int
Lowcost[MAXNUM]; }*PCLOSEDGE; 类型
//标志位成功
//标志位失败
//标志位无穷
//定义函数状态数据类型 //定义顶点向量数据类型
//定义邻接矩阵数//定义图数据类型 //图的顶
点向量
//图的邻接矩阵 //图的当前顶点 //图的当前弧
//定义图的指针数据类型 //定义辅助数组数据类型 //图的顶点向量 //
//定义辅助数组指针数据
3
叮叮小文库
123项目模块设计
创建景区景点分布图
一.邻接矩阵(Adjacency Matrix)(二维数组表示法) 在图的邻接矩阵表示中,有一个记录各个顶点信息的顶点表, 系的邻接矩阵。
设图A = (V, E)是一个有n个顶点的图,图的邻接矩阵是一个二维数组 (满足如下条件的n阶矩阵):
A.edge[n][n],定义
还有一个表示各个顶点之间关
A.Edge[i][j]
无向图数组表示法特点:
1, if ( E or (i, j) E ) 0,
otherwise
1) 无向图邻接矩阵是对称矩阵,同一条边表示了两次;
2) 顶点v的度:在无向图中等于二维数组对应行(或列)中 1的个数;在有向图中,统计 第i行1的个数可得顶点i的出度,统计第j列1的个数可得顶点j的入度。 3) 判断两顶点v、u是否为邻接点:只需判二维数组对应分量是否为 4) 顶点不变,在图中增加、删除边:只需对二维数组对应分量赋值 与它的顶点数有关,与边数无关;适用于边稠密的图; 流程图:
1 ; 1或清0;
5) 设存储顶点的一维数组大小为 n(图的顶点数n), G占用存储空间:n+n2; G占用存储空间 只
初始化图的顶点数 scanf(\
ph->VexNum);
初始化图的弧数 scanf(\
ph->ArcNum);
初始化图的顶
点名称
初始化图的弧权值 为最大值 输入弧的信息
4
程序:
//创建景区景点分布图
STATUS CreateGraph(PGRAPH pGraph) {
prin tf(\\\ n\
prin tf(\创建景区景点分布图\\t$\\n\
prin tf(\\\ n\//初始化图的顶点数
prin tf(\初始化顶点数和弧度数……\\n\printf(\请输入图的顶点数(<=20):\scan f(\//检查
if(pGraph->VexNum>20) {
printf(\警告:输入数据错误! ! ! \\n\printf(\按任意键回主菜单! !!\getch();
return FAILURE; }
//初始化图的弧数
printf(\请输入图的弧度数(<=20):\scan f(\//检查
if(pGraph->ArcNum>20) {
printf(\警告:输入数据错误! ! ! \\n\printf(\按任意键回主菜单! !!\getch();
return FAILURE; }
//初始化图的顶点名称
printf(\\\n\prin tf(\初始化的顶点名称……\\n\for(i nt i=O;i
printf(\请输入第%d个顶点名称:\f(\}
//初始化图的弧权值为最大值
for(i=0;i
叮叮小文库
5