目录
目录
一、【问题描述和基本要求】
1.【问题描述】
设计一个校园导游程序,为来访的客人提供各种信息查询服务。
2.【基本要求】
(1) 设计你所在学校的校园平面图,所含景点不少于10个.以图中顶点表示校内各景点,存放景点名称、代号、简介 等信息;以边表示路径,存放路径长度等相关信息。
(2) 为来访客人提供图中任意景点相关信息的查询。
(3) 为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。
3.【测试数据】
以江苏科技大学长山校区为例。
4.【实现提示】
一般情况下,校园的道路是双向通行的,可设校园平面图是一个无向网,顶点和边均含有相关信息.
二、【设计思路】
1.【基础结构体】
int num | 景点序号 |
string name | 景点名字 |
string intru | 景点介绍 |
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]; } } } } }