数据结构实验二:校园导游咨询

目录

一、【问题描述和基本要求】

1.【问题描述】

2.【基本要求】

3.【测试数据】

4.【实现提示】

二、【设计思路】

1.【基础结构体】

2、【主要方法】

(1)无向图的邻接矩阵

(2)弗洛伊德算法求最短路径

3、【主要函数】

4、【校区平面图】

5、【部分程序展示】


目录

一、【问题描述和基本要求】

1.【问题描述】

2.【基本要求】

3.【测试数据】

4.【实现提示】


一、【问题描述和基本要求】

1.【问题描述】

设计一个校园导游程序,为来访的客人提供各种信息查询服务。

2.【基本要求】

(1) 设计你所在学校的校园平面图,所含景点不少于10个.以图中顶点表示校内各景点,存放景点名称、代号、简介  等信息;以边表示路径,存放路径长度等相关信息。  

(2)  为来访客人提供图中任意景点相关信息的查询。

(3) 为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。

3.【测试数据】

以江苏科技大学长山校区为例。

4.【实现提示】

一般情况下,校园的道路是双向通行的,可设校园平面图是一个无向网,顶点和边均含有相关信息.

二、【设计思路】

1.【基础结构体】

attraction
int num景点序号
string name景点名字
string intru景点介绍
AdjGraph
int AdjMatric[MAXVER][MAXVER]二维数组存放邻接矩阵
Attraction point[MAXVER]景点数组
int pointnum景点个数
int edgenum边的个数

2、【主要方法】

(1)无向图的邻接矩阵

在这里插入图片描述

无向图的邻接矩阵是对称的

输入总顶点数和总边数
依次输入点的信息存入顶点表中。
初始化邻接矩阵,使每个权值初始化为极大值。
构造邻接矩阵
 

(2)弗洛伊德算法求最短路径

基本思想:
弗洛伊德算法定义了两个二维矩阵:

矩阵D记录顶点间的最小路径
例如D[0][3]= 10,说明顶点0 到 3 的最短路径为10;
矩阵P记录顶点间最小路径中的中转点
例如P[0][3]= 1 说明,0 到 3的最短路径轨迹为:0 -> 1 -> 3。
它通过3重循环,k为中转点,v为起点,w为终点,循环比较D[v][w] 和 D[v][k] + D[k][w] 最小值,如果D[v][k] + D[k][w] 为更小值,则把D[v][k] + D[k][w] 覆盖保存在D[v][w]中。


3、【主要函数】

void InitGraph(AdjGraph& G)初始化无向图
void Menu()显示菜单
void Print(AdjGraph& G)显示所有景点的信息
void Floyd(AdjGraph& G)用弗洛伊德算法算最短路径
void SearchPath(AdjGraph& G)找到任意两点之间的最短路径
void Delpoed(AdjGraph& G)删除某个景点及其相关的边
void Update(AdjGraph& G)更新景点信息

4、【校区平面图】

景点介绍:

1.海韵湖        可以吹吹湖风看看夜景,可以划船游玩

2.船建楼        有许多船舶相关的东西,有船模等

3.计算机学院        有计算机实验室,办公室,可以供本专业学生去学习

4.文理大楼        江科大地标建筑

5.图书馆        给学生提供自习学习场所,有许图书可供学生借读

6.东苑食堂        有三层,第二层价格亲民,第三层有更好吃的饭菜

7.东操场        离东区比较近,便利东区同学锻炼身体

8.文体中心        有羽毛球场,篮球场,乒乓球场等等,在这里可以放松自己

9.西操场        适合举办活动,离西边比较近,便于体育课锻炼

10.53栋宿舍楼        住宿区,离食堂超市等比较近,给同学提供休息场所

11.西苑食堂        三楼有少数民族餐厅,一楼二楼的饭菜都很好吃

5、【部分程序展示】

void Floyd(AdjGraph& G)
{
	/*
	int PathMatirx[MAXVEX][MAXVEX]:记录对应点的最小路径的前驱点
	int ShortPath[MAXVEX][MAXVEX]:记录顶点间的最小路径值
	*/
	//对Floyd的两个数组进行初始化
	for (int i = 0; i < G.pointnum; i++) {
		for (int j = 0; j < G.pointnum; j++) {
			PathMatirx[i][j] = j;
			ShortPath[i][j] = G.AdjMatrix[i][j];
		}
	}
	for (int k = 0; k < G.pointnum; k++) {
		for (int v = 0; v < G.pointnum; v++) {
			for (int w = 0; w < G.pointnum; w++) {
				if (ShortPath[v][w] > ShortPath[v][k] + ShortPath[k][w]) {
					//更新最短路径
					ShortPath[v][w] = ShortPath[v][k] + ShortPath[k][w];
					//更新路径中间节点
					PathMatirx[v][w] = PathMatirx[v][k];
				}
			}
		}
	}
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值