在旅游景区,经常会遇到游客打听从一个景点到另一个景点的最短路径和最短距离,这类游客不喜欢按照导游图的线路来游览,而是挑选自己感兴趣的景点游览。为于帮助这类游客信息查询,就需要计算出所有景点之间最短路径和最短距离。算法采用迪杰斯特拉算法或弗洛伊德算法均可。
建立一个景区旅游信息管理系统,实现的主要功能包括制订旅游景点导游线路策略和制订景区道路铺设策略。
任务中景点分布是一个无向带权连通图,图中边的权值是景点之间的距离。
(1)景区旅游信息管理系统中制订旅游景点导游线路策略,首先通过遍历景点,给出一个入口景点,建立一个导游线路图,导游线路图用有向图表示。遍历采用深度优先策略,这也比较符合游客心理。
(2)为了使导游线路图能够优化,可通过拓朴排序判断图中有无回路,若有回路,则打印输出回路中的景点,供人工优化。
(3)在导游线路图中,还为一些不愿按线路走的游客提供信息服务,比如从一个景点到另一个景点的最短路径和最短距离。在本线路图中将输出任意景点间的最短路径和最短距离。
(4)在景区建设中,道路建设是其中一个重要内容。道路建设首先要保证能连通所有景点,但又要花最小的代价,可以通过求最小生成树来解决这个问题。本任务中假设修建道路的代价只与它的里程相关。
因此归纳起来,本任务有如下功能模块:
创建景区景点分布图;
输出景区景点分布图(邻接矩阵)
输出导游线路图;
判断导游线路图有无回路;
求两个景点间的最短路径和最短距离;
输出道路修建规划图。
主程序用菜单选项供用户选择功能模块。
主程序采用设计主菜单调用若干功能模块,同时在主程序中定义两个邻接链表类型变量g和g1,作为调用子函数的参数。
建图子模块建立无向带权图,输入顶点信息和边的信息,输出邻接链表g。由于是无向边,输入一条边时构建两条边。
输出图子模块:从邻接链表g转换成邻接矩阵a,并输出邻接矩阵a。图中边的权值∞用32767表示。
遍历子模块:通过遍历图g,只得到遍历的顶点序列。我们先将顶点序列存在数组vex中,然后再转换成导游线路存入数组vex1中,最后生成导游线路图g1(同样用邻接链表存储,供拓朴排序用)。
将遍历顶点序列转换成导游线路。
图10-43(a)(b)(c)三个无向图的深度优先搜索遍历的结果均为v1→v2→v3→v4。但它们的导游线路图却不同。图(a)的导游线路图为v1→v2→v3→v4,与遍历结果相同。
图(b)的导游线路图为v1→v2→v3→v2→v4,图(c)的导游线路图为v1→v2→v3→v2→v1→v4。
遍历结点序列与导游线路图转换的策略:
设遍历结果为v1→v2→…→vi→vi+1→…→vn
对于结点vi和vi+1,如果vi和vi+1存在边,则直接转换。
否则,加入边vi→vi-1,如果vi-1和vi+1存在边,则加入边vi-1→vi+1。
再否则,加入边vi-1→vi-2,如果vi-2和vi+1存在边,则加入边vi-2→vi+1。
如果vi-2和vi+1还不存在边,继续回溯,一定能找到某个整数k(因为景点分布图是连通图),使得vi-k和vi+1存在边,则加入边vi-k→vi+1。
在本任务中,转换后的线路图存于数组vex1中。
流程图见10-29。
拓朴排序子模块流程图,见图10-39源程序,参见10.7 节的。
求最短路径子模块流程图:见10-34。源程序,参见10.6 节的。
求最小生成树子模块流程图:见19-33。源程序,参见10.6 节的。
景点的信息包括景点的名称和近邻景点之间的通路和距离。用邻接链表存储景点分布图的信息。
带权无向)图的邻接链表。
*程序功能:建立一个旅游景区管理系统,实现旅游路线选择 */
/*景区道路优化等功能。
#include“
#include“
#include “
#define max_edge_num100/*定义图的最大边数*/
#define max_vertex_num 20
#define maxnum 32767
typedef char vertex_type[10];
typedef struct node/*边表结点*/
edge_node;
typedef struct /*顶点表结点*/
vertex_node;
typedef struct
lgraph;
边的类型定义。
在求最小生成树时,用到边的定义。
typedef struct
edge_type;
主程序源程序。
/*函数名:main
/*入口参数:无。
/*返回值:无。
voidmain()
getchar();
printf("按回车键继续。
getchar();
建图子模块源程序参见10.3 节的create_graph()函数。
输出图子模块。
/*函数名:output_graph
/*函数功能:输出图g的邻接矩阵。
/*入口参数:g --邻接链表。
/*返回值:无。
void output_graph(lgraph *g)
for(i=0;in;i++)
for(j=0;jn;j++)
if (i==j)
a[i][j]=0;
elsea[i][j]=maxnum;
for (i=0;i< g->n;i++)
printf("景点分布图邻接矩阵为:");
printf("%8s ",
for (i=0;in;i++)
printf("%8s ",g->adjlist[i].vertex);
for (i=0;in;i++)
遍历子模块。
/*函数名:dfs_main
/*函数功能:生成导游线路图。
/*入口参数:g-- 景点分布图。
/*g1 — 导游线路图。
/*返回值:无。
voiddfs_main(lgraph *g,lgraph *g1)
do else
printf("景点号输入有误,请重新输入!");
}while(1);
j=0;dfs(g,x,visited,vex,&j);/每次调用时,j初始化为0
/*构建游览线路,存放在数组vex1*/
i1=0;for(i=0;i< g->n-1;i++)
vex1[i1++]j;
/*建立游览线路图的邻接链表g1,供拓朴排序用*/
for (i=0;in;i++)
for (k=0;kadjvex=j;
p-> weight=1; /建立游览线路图时,不考虑边的权值*/
q=g1->adjlist[i].firstedge;
g1->adjlist[i].firstedge=p;
p->next=q;
g1->n=g->n;
g1->m=i1-1;
/*输出游览线路*/
printf(“游览线路为:”)
for (k=0;k”,g->adjlist[i].vertex);
printf(“%s”,g->adjlist[vex1[i1-1] ]vertex);
/*函数名:dfs
/*函数功能:以vi为出发点对邻接表存储的图g进行dfs搜索 */
/*入口参数:g-- 图g的邻接表存储。
/*i— 顶点vi
/*visited— 标志顶点是否已被访问的数组。
/*vex— 存放遍历时所经过的顶点。
/*j— 存放位置。
/*返回值:无。
voiddfs(lgraph *g,int i, int visited,int vex int *j)
旅游景区管理系统课案
系统概述。1.背景。由于时下大多数人生活优越,交通工具方便快捷,信息获取方便,导致旅游业迅速发展。为了方便旅游爱好者在网上获取信息,有效地掌握景区的相关信息,开发出一套适合于旅游者在网络上快速获取信息的管理系统,通过本系统,出行者可以查看河南的全部景点列表,了解某个景点的详细情况,自驾车 公交线路,...
旅游景区知识管理系统的设计
云南民族大学学报 自然科学版。贾志洋 贾媛 李丁 王进平。云南大学旅游文化学院,云南丽江 哈尔滨工程大学经济管理学院,黑龙江哈尔滨 摘要 旅游景区的知识管理是指建立在旅游业信息化 网络化基础之上,对旅游景区生产和经营依赖的知识及其收集 组织 创新 扩散 使用和开发等一系列过程进行管理 知识管理系统,...
旅游景区地环境管理系统
旅游景区管理讨论报告 二 tourism scenic area management discussion 2 讨论主题 旅游景区环境管理 专业年级 13级旅游管理三班。课题组分工及贡献 谷迪迪 旅游景区环境管理的概念。自身环境管理 舒小芹。历史文化管理 何少春。基础设施 和小宇 刘骋。市场秩序 ...