# 景区旅游管理系统
##
## 需求分析
景区旅游信息管理系统的需求背景:在旅游景区,经常会遇到游客打听从一个景点到另一个景点的最短路径和最短距离,这类游客不喜欢按照导游图的线路来游览,而是挑选自己感兴趣的景点游览。
所以景区旅游管理系统包括如下功能:
- 文件导入景点与道路
- 输出景区景点图
- 输出导游线路图;
- 判断导游线路图有无回路;
- 求两个景点间的最短路径和最短距离;
- 输出道路修建规划图。
主程序用菜单选项供用户选择功能模块。
## 总体设计
用 nodes 文件输入景点信息,用 routes 文件输入景点连通情况。
- 输出景点图,用 ege 库实现
- 输出导游路线图,采用深度优先遍历
- 判断有无回路,采用拓扑排序
- 求两个景点的最短路径和最短距离,采用弗洛伊德算法
- 输出道路修建规划图,即最小生成树,采用 prim 算法
![](https://www.writebug.com/myres/static/uploads/2021/11/9/530e9cf6ccd02e9cdc2bcbc2cbb164b6.writebug)
## 详细设计
```c++
//2' 输出图形化景点分布
int PrintfGraph(PGraph pgraph) {
initgraph(1000,600); //初始化,显示一个窗口
for(int i=0; i<sizeof(nodes)/sizeof(node); i++) {
outtextxy(nodes[i].x,nodes[i].y,nodes[i].point_name); //输出景点名称
}
for(int i=0; i<sizeof(routes)/sizeof(route); i++) {
line(nodes[routes[i].src].x,nodes[routes[i].src].y,nodes[routes[i].dst].x,nodes[routes[i].dst].y);
}
getch(); // 暂停一下等待用户按键
closegraph(); // 关闭图形界面
printf("按任意键返回主菜单\n");
printf("\n");
system("pause");
return SUCCESS;
}
```
![](https://www.writebug.com/myres/static/uploads/2021/11/9/4a71c5ec9e238bcf026e040e74e657c5.writebug)
```c++
//3、输出景区导游路线(深度优先)
int TraverseGraph(PGraph pgraph) {
int V,i,j;
np=0;
for(i=0; i<pgraph->VexNum; i++)
Visited[i]=0;
printf("输出景区导游线路图:\n");
printf("请输入景点出发位置编号:\n");
scanf("%d",&V);
printf("景点导游路线为:\n");
DFS(pgraph,V-1);
printf("\n\n");
printf("按任意键返回主菜单\n");
system("pause");
return SUCCESS;
}
//深度优先函数
void DFS(PGraph pgraph,int V) {
int j;
np++;
printf("%s ",pgraph->Vexs[V]);
Visited[V]=1;
for(j=0; j<pgraph->VexNum; j++)
{
if((pgraph->Arcs[V][j]!=INF&&pgraph->Arcs[V][j]!=0)&&Visited[j]!=1)
{
DFS(pgraph,j);
if(pgraph->VexNum>np)
printf("%s ",pgraph->Vexs[V]);
}
}
}
```
![](https://www.writebug.com/myres/static/uploads/2021/11/9/14f50ba3c38a3613330d695747a21d65.writebug)
```c++
//4、判断导游线路有无回路(拓扑排序)
int TopologicalSort(PGraph pgraph)
{
int i,j;
printf("判断导游线路有无回路:\n\n");
//定义入度数组,记录每个顶点的入度,初始化为0
int Indegree[MAX_VERTEX_NUM]= {0};
//定义桟、并初始化桟
STACK Stack;
if(InitStack(&Stack,pgraph->VexNum)==FAILURE)
{
printf("警告:创建桟失败!!!\n");
printf("按任意键回主菜单\n");
system("pause");
return FAILURE;
}
//求顶点的入度
for(j=0; j<pgraph->VexNum; j++)
{
for(i=0; i<pgraph->VexNum; i++)
if(pgraph->Arcs[i][j]!=0&&pgraph->Arcs[i][j]!=INF)
Indegree[j]++;
//入度为0的点入栈
if(Indegree[j]==0)
PushStack(&Stack,j);
}
int Count=0,k;
while(StackLen(&Stack))
{
PopStack(&Stack,&k);
Count++;
//对出栈的顶点所指向的点的入度减一,并将新入度为0的点入栈
for(j=0; j<pgraph->VexNum; j++)
{
if(pgraph->Arcs[k][j]!=0&&pgraph->Arcs[k][j]!=INF)
if((--Indegree[j])==0)
PushStack(&Stack,j);
}
}
//判断是否有回路
if(Count==pgraph->VexNum)
printf("导游线路图无回路\n");
else
{
printf("导游线路图有回路\n");
}
printf("\n按任意键回主菜单\n");
system("pause");
return SUCCESS;
}
//初始化栈,为拓扑排序用
int InitStack(STACK*PStack,int num)
{
PStack->base=(int*)malloc(num*sizeof(int));
PStack->top=PStack->base;
PStack->stacksize=num;
return SUCCESS;
}
//入栈
int PushStack(STACK*PStack,int j)
{
if(PStack->top-PStack->base==PStack->stacksize)
return FAILURE;
*(PStack->top++)=j;
return SUCCESS;
}
//栈的长度
int StackLen(STACK*PStack)
{
return PStack->top-PStack->base;
}
//出栈
int PopStack(STACK*PStack,int*Pk)
{
if(PStack->top==PStack->base)
return FAILURE;
*Pk=*(--(PStack->top));
return SUCCESS;
}
//5、两个景点的最短路径(弗洛伊德)
int MinShortPath(PGraph pgraph)
{
printf("景点间的最短路径:\n\n");
int PathMatrix[pgraph->VexNum][pgraph->VexNum];//路径矩阵
int DisMatrix[pgraph->VexNum][pgraph->VexNum]; //距离矩阵
int i,j,k;
//初始化两矩阵
for(i=0; i<pgraph->VexNum; i++)
{
for(j=0; j<pgraph->VexNum; j++)
{
DisMatrix[i][j]=pgraph->Arcs[i][j];
if(DisMatrix[i][j]!=INF&&DisMatrix[i][j]!=0)
PathMatrix[i][j]=i;
else
PathMatrix[i][j]=-1;
}
}
//更新两矩阵
for(k=0; k<pgraph->VexNum; k++)
for(i=0; i<pgraph->VexNum; i++)
for(j=0; j<pgraph->VexNum; j++)
if(DisMatrix[i][j]>DisMatrix[i][k]+DisMatrix[k][j])
{
DisMatrix[i][j]=DisMatrix[i][k]+DisMatrix[k][j];
PathMatrix[i][j]=k;
}
//准备输出两景点的最短路径
int Stav=-1,Endv=-1;
printf("请输入起点和终点编号:\n");
scanf("%d%d",&Stav,&Endv);
Stav--;
Endv--;//用户输入时是以正常数字顺序输入,而数组是从0开始,故减1
// 判断起始点名称和终点名称是否存在
if(Stav==-1||Endv==-1)
return FAILURE;
STACK Stack;
if(InitStack(&Stack,pgraph->VexNum)==FAILURE)
{
printf("警告:创建桟失败!!! \n");
printf("按任意键回主菜单\n");
system("pause");
}
printf("\n两景点最短距离为%d\n",DisMatrix[Stav][Endv]);
while(Endv!=-1)
{
PushStack(&Stack,Endv);
Endv=PathMatrix[Stav][Endv];
}
// 将所有路径出桟、并输出
printf("两景点最短路线为:\n");
while(1)
{
PopStack(&Stack,&Stav);
printf("%s ",pgraph->Vexs[Stav]);
if(!StackLen(&Stack))
break;
}
printf("\n\n按任意键返回主菜单\n");
system("pause");
return SUCCESS;
}
```
![](https://www.writebug.com/myres/static/uploads/2021/11/9/a4890b77b8f2833ba75c3aa7a0c3a809.writebug)
```c++
//6、输出道路修建规划图(最小生成树 prim算法)
MiniSpanTree_Prim(PGraph pgraph)
{
int lowcost[MAX_VERTEX_NUM],closest[MAX_VERTEX_NUM];
int i,j,k,min,v=0;//(v=0:从第一个顶点开始构建生成树)
printf("输出道路修建规划图:\n");
//初始化lowcost数组和closest数组
for(i=0; i<pgraph->VexNum; i++)
{
lowcost[i]=pgraph->Arcs[v][i];
closest[i]=v;
}
//开始加点并更新lowcost和closest数组
for(i=1; i<pgraph->VexNum; i++)
{
min=INF;
for(j=0; j<pgraph->VexNum; j++)
{
if(lowcost[j]!=0&&lowcost[j]<min)
{
min=lowcost[j];
k=j;
}
}
if(min<INF) {
printf("%s->%s\n",pgraph->Vexs[closest[k]],pgraph->Vexs[k]);
}
lowcost[k]=0;
//更新两数组
for(j=0; j<pgraph->VexNum; j++)
{
if(pgraph->Arcs[k][j]!=0&&pgraph->Arcs[k][j]<low
没有合适的资源?快使用搜索试试~ 我知道了~
基于C++实现(控制台)景区旅游管理系统【100010831】
共37个文件
png:14个
o:5个
h:4个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 1 下载量 36 浏览量
2023-02-15
17:23:08
上传
评论 1
收藏 4.37MB ZIP 举报
温馨提示
本项目主要使用C++开发,使用二维数组记录从(起点、终点)到中转点的映射关系,通过while循环从末尾输出,体现了弗洛伊德算法的本质,递推+贪心。倒序入栈,再逐个出栈。完成路径的输出,方便游客挑选自己感兴趣的景点游览。
资源推荐
资源详情
资源评论
收起资源包目录
100010831-基于C++实现(控制台)景区旅游管理系统.zip (37个子文件)
scenery_command_system
Code
graph.o 12KB
io.cpp 4KB
项目1.layout 505B
hashtable.o 33KB
io.h 807B
io.o 969KB
types.h 248B
main.cpp 654B
routes.txt 69B
points.txt 74B
Makefile.win 1KB
main.o 960KB
项目1.dev 2KB
hashtable.cpp 4KB
graph.cpp 8KB
Menu.o 9KB
项目1.exe 3.01MB
hashtable.h 788B
graph.h 1KB
LICENSE 1KB
景区旅游系统 .docx 389KB
景区旅游.mp4 2.71MB
img.docx-md
7-2041bd5e97bcafb36f3c0b36564a8d89.png 54KB
12-9407605d601ee6792fa50b8edc99e06c.png 22KB
6-c86ab51624c17f8e02e8fdab7e8619bd.png 13KB
2-0f3608d548692767ad31cc60f4af9b09.png 26KB
8-050838318d43aa8d418917f25c22daf6.png 46KB
13-29283be2d4501049c433325b140862c3.png 31KB
10-d8c525e15254aea37f5f16362b16c7e7.png 21KB
4-ca9b8ca9911b76596ebdffedaff6e4f4.png 12KB
1-d2107880a35058314ed8c0ddc3fb5533.png 22KB
14-858a07ee6c68a6f3b44d4333553f568e.png 26KB
11-d5dc153fa3752c9f691c7c4da4707f45.png 31KB
5-f5d49eb5fddd9ac411bbb2c45eff6494.png 13KB
3-ba1f62dd3701c82614e38ae9bf968818.png 11KB
9-07921fbae7c32b9b757bf48738ad4455.png 30KB
README.md 13KB
共 37 条
- 1
资源评论
- ghdafuyg2024-04-30资源使用价值高,内容详实,给了我很多新想法,感谢大佬分享~
神仙别闹
- 粉丝: 2679
- 资源: 7667
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功