【数据结构与算法实验】景区信息管理系统

任务背景
有一个景区,景区里面有若干个景点,景点之间满足以下条件:

  1. 某些景点之间铺设了道路(相邻)
  2. 这些道路都是可以双向行驶的(无向图)
  3. 从任意一个景点出发都可以游览整个景区(遍历连通图)

景区图如下:
在这里插入图片描述
景点数据
景区的数据包含景点信息和景点之间的道路信息。分别由两个文本文件存储。
Vex.txt文件用来存储景点信息;Edge.txt文件用来存储道路信息。
在这里插入图片描述
实现代码如下:
Main.cpp

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include"Graph.h"
#include"Tourism.h"
using namespace std;

Graph m_Graph;
int main()
{
   
	int nSelection = -1;
	do {
   
		cout << "===== 景区信息管理系统 =====" << endl;
		cout << "1.创建景区景点图" << endl;
		cout << "2.查询景点信息" << endl;
		cout << "3.旅游景点导航" << endl;
		cout << "4.搜索最短路径" << endl;
		cout << "5.铺设电路规划" << endl;
		cout << "0.退出" << endl;
		cout << "请输入操作编号(0~5):";
		//该循环用来解决输入字符(串)后会进入死循环的问题
		while (scanf("%d", &nSelection) != 1) {
   
			//scanf函数有n个输入正确便会返回n
			cout << "输入有误,请输入0~5的数字:";
			while (getchar() != '\n') {
   };
			//内层while循环换成下面的语句也可以解决问题,但VS2017的编译器不支持fflush(stdin)函数
			//fflush(stdin);
		}
		switch (nSelection) {
   
		case 1: CreateGraph(); break;   //创建景区景点图
		case 2: GetSPotInfo(); break;   //查询景点信息
		case 3: TravelPath(); break;    //旅游景点导航
		case 4: FindShortPath(); break; //搜索最短路径
		case 5: DesigePath(); break;    //铺设电路规划
		case 0: cout << "程序已退出\n"; system("pause"); exit(0); break;//退出
		default: cout << "输入有误,请输入0~5的数字:"; break;
		}
	} while (nSelection != 0);

	return 0;
}

Graph.h

#ifndef GRAPH_H
#define GRAPH_H

//定义顶点
struct Vex
{
   
	int num;					//景点编号
	char name[20];				//景点名称
	char desc[1024];			//景点介绍
};

//定义边
struct Edge
{
   
	int vex1;					//边的第一个顶点
	int vex2;					//边的第二个顶点
	int weight;					//权值
};

//定义图
struct Graph
{
   
	int m_aAdjMatrix[20][20];   //邻接矩阵
	Vex m_aVexs[20];            //顶点信息数组 
	int m_nVexNum;              //当前图的顶点个数 
};

//定义路径
typedef struct Path
{
   
	int vexs[20];	//保存一条路径
	Path *next;		//下一条路径
}*PathList;

//初始化图
void Init();

//插入顶点信息
bool InsertVex(Vex sVex);

//插入边信息
bool InsertEdge(Edge sEdge);

//获取当前顶点数
int GetVexmun();

//查询指定顶点信息
Vex GetVex(int v);

//查询与指定顶点相连的边
int FindEdge(int nVex, Edge aEdge[]);

//使用深度优先搜索算法遍历图
void DFS(int nVex, bool bVisted[], int &nIndex, PathList &pList);
/*
输入参数:int nVex,顶点编号。
输入参数:bVisted[],bool 类型的数组,用来记录某个顶点是否被遍历过。
输入参数:int &nIndex,记录遍历的深度。
输出参数:PathList &pList,遍历得到的结果。
功能:使用深度优先搜索算法遍历图
*/

//通过调用 DFS()函数,得到深度优先搜索遍历结果
void DFSTraverse(int nVex, PathList &pList);
/*
输入参数:int nVex,顶点编号。
输出参数:PathList &pList,遍历得到的结果。
功能:通过调用 DFS()函数,得到深度优先搜索遍历结果。
*/

//通过Dijkstra算法求得nVexStart到nVexEnd的最短路径
int FindShortPath(int nVexStart, int nVexEnd, Edge aPath[]);
/*
输入:起始景点的编号 v1 和目的景点的编号 v2。
输出:最短路径。
功能:通过 Dijkstra 算法求得 v1 到 v2 的最短路径
*/

//通过 Prim 算法构建最小生成树
void FindMinTree(Edge aPath[]);
/*
输入:Edge aPath[]
输出:最小生成树。
功能:通过 Prim 算法构建最小生成树
*/

#endif

Graph.cpp

#include<iostream>
#include"Graph.h"
using namespace std;

//m_Graph图结构已经在主函数中定义,在此处调用
extern Graph m_Graph;

//初始化图结构
void Init()
{
   
	for (int i = 0; i < 20; i++) {
   
		for (int j = 0; j < 20; j++) {
   
			m_Graph.m_aAdjMatrix[i][j] = 0;	//权值信息初始化为0
		}
		m_Graph.m_nVexNum = 0;				//景点数目初始化为0
	}
}

//插入顶点信息
bool InsertVex(Vex sVex)
{
   
	if (m_Graph.m_nVexNum == 20) //顶点已满
		return false;
	m_Graph.m_aVexs[m_Graph.m_nVexNum++] = sVex
  • 5
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在旅游景区,经常会遇到游客打听从一个景点到另一个景点的最短路径和最短距离,这类游客不喜欢按照导游的线路来游览,而是挑选自己感兴趣的景点游览。为于帮助这类游客信息查询,就需要计算出所有景点之间最短路径和最短距离。算法采用迪杰斯特拉算法或弗洛伊德算法均可。建立一个景区旅游信息管理系统,实现的主要功能包括制订旅游景点导游线路策略和制订景区道路铺设策略。 任务中景点分布是一个无向带权连通中边的权值是景点之间的距离。 (1)景区旅游信息管理系统中制订旅游景点导游线路策略,首先通过遍历景点,给出一个入口景点,建立一个导游线路,导游线路用有向表示。遍历采用深度优先策略,这也比较符合游客心理。 (2)为了使导游线路能够优化,可通过拓朴排序判断中有无回路,若有回路,则打印输出回路中的景点,供人工优化。 (3)在导游线路中,还为一些不愿按线路走的游客提供信息服务,比如从一个景点到另一个景点的最短路径和最短距离。在本线路中将输出任意景点间的最短路径和最短距离。 (4)在景区建设中,道路建设是其中一个重要内容。道路建设首先要保证能连通所有景点,但又要花最小的代价,可以通过求最小生成树来解决这个问题。本任务中假设修建道路的代价只与它的里程相关。 归纳起来,本任务有如下功能模块:(1)创建景区景点分布;(2)输出景区景点分布(邻接矩阵)(3)输出导游线路;(4)判断导游线路有无回路;(5)求两个景点间的最短路径和最短距离;(6)输出道路修建规划。(7)主程序用菜单选项供用户选择功能模块。  

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值