第一章 概述
1.1 问题描述
根据题目内容,需要用无向网表示所在学校的景点平面图,即校内每个景点
为无向网中的各个结点,景点的编号、名称、简介等信息存储在结点中,图中的 边表示景点间的道路,存放景点之间的路径长度等信息。需要回答有关景点介绍、
游览路径等问题。具体要求为:
(1) 能够查询各个景点的相关信息。
(2) 查询图中任意两个景点间的最短路径。
(3) 查询图中任意两个景点间的所有路径。
(4) 增加、删除、更新有关景点和道路的信息。
1.1.1 问题背景
随着疫情的结束,越来越多的人选择进高校游玩,但是由于校园面积较大,游客们又对学校的路线不熟悉,凭感觉乱逛,往往参观几个景点以后就精疲力竭了。这就迫切需要一个可以为来访客人提供全方位、个性化的导览服务的校园导游程序,使他们更加方便、轻松地了解和探索学校校园。通过提供详细的景点介绍、地图导航、路线规划等功能,游客可以更好地规划自己的行程,提高旅游体验。
1.1.2 问题分析
题目要求我们使用无向网来表示一个学校的校园景点平面图,其中顶点代表主要景点,边代表景点之间的道路。我们需要实现几个基本功能:查询各景点的相关信息、查询任意两个景点间的最短路径、查询任意两个景点间的所有路径,以及增加、删除、更新有关景点和道路的信息。
为了解决这个问题,首先需要对校园的景点图信息进行收集,在百度地图中可 以搜索到相应的信息。其次是选择合适的图存储结构,由于题目中提到的是无向网,考虑到查询任意两个景点间的最短路径和所有路径,邻接矩阵可能更为方便,选择邻接矩阵作为图的存储结构。然后使用一个结构体或类来存储每个景点的编号、名称、简介等信息。针对路径查询的问题,选择使用弗洛伊德算法来实现最短路径查询,使用深度优先搜索来实现所有路径查询。对于增加、删除和更新操作,设计相应的算法来更新图的存储结构和相关信息。
1.2 开发环境
编译器:Dev C++ 6.3 开发环境:Windows 11系统
- 第二章 需求分析
2.1 系统要求
(1) 建立校园导游系统,提升游客的体验感。
(2) 实现查询各景点的相关信息功能。
(3) 实现查询图中任意两个景点间的最短路径和所有路径功能。
(4) 实现对景点信息的增加、删除、更新有关景点和道路的信息功能。
2.2 系统功能
(1)主要功能:可以快速查询各景点的相关信息和任意两个景点间的最短路径和所有路径以及对景点信息的增加、删除、更新有关景点和道路的信息。
(2)具体功能:系统会提供给游客和管理员五个功能选项并指出输入方式,详细功能如下所示:
<1>安工程景点信息查询:游客输入系统所设置的对应选项即可查看景点的平面图和可查询的景点,然后输入要查询的景点的编号即可查询到该景点的全部信息。
<2>两景点之间最短路查询:游客输入系统所设置的对应选项,然后输入起点的景点编号和终点的景点编号,即可得到起点景点至终点景点的最短路径。
<3>两景点间所有路径查询:游客输入系统所设置的对应选项,然后输入起点的景点编号和终点的景点编号,即可得到起点景点至终点景点的所有路径。
<4>景点和路径信息的删除或增加(更新):管理员输入对应选项后按照系统的提示选择删或增加功能选项并进一步按照提示进行操作,即可实现景点和路径信息的删除或增加。
<0>退出系统:游客输入对应选项后即可退出本系统。
(3)系统功能结构图
图 2-1 安工程校园导游系统功能结构图
2.3 系统优缺点
(1)优点:可供使用者方便快捷地查询各景点的相关信息和任意两个景点间的最短路径和所有路径以及对景点信息的增加、删除、更新有关景点和道路的信息。操作简单易懂且系统会根据操作者所选的选项进行下一步的提示,逻辑结构十分严谨,非常实用可靠。
(2)缺点:无所满足求多个景点的最佳游览路径,导游图的界面不够仿真。
2.4 系统展望
(1)虽然它的时间复杂度为O(n^2)且只能得到近似最优解,而不是全局最优解但是对于校园景点最短路径查询这种较小规模的问题,贪婪算法通常可以得到较好的结果。故可以使用贪婪算法实现求多个景点的最佳游览路径的功能。
(2)借助QT页面开发工具来精细化导游图的仿真界面,提升用户体验感。
第三章 算法概要设计
3.1 主要算法流程
3.1.1 初始化信息模块
初始化信息模块由两个函数组成,其功能为预置校园景点图的信息,对校园景点图进行初始化,为后续操作提供基础的景点图信息。其运行过程由图3-1所示。
图 3-1初始化信息模块流程
3.1.2 景点信息查询模块
景点信息查询模块由两个函数组成,其功能为展示景点平面图并查询已有的景点信息。该模块运行时,首先输出校园平面景点图,然后输出可查询的景点及其编号,使用者之后根据提示需输入要查询的景点编号,即可查询到想了解的景点信息。模块流程如图3-2所示。
图 3-2 景点信息查询模块流程
3.1.3 Floyd最短路径求解算法
最短路径查询模块由两个函数组成,其功能为求两景点之间的最短路径。首先需要输入起点的景点编号,然后输入终点的景点编号,此模块采用弗洛伊德算法求最短路径,最后输出两景点之间的最短路径。如图3-3所示。
图 3-3最短路径查询模块流程
弗洛伊德算法(Floyd算法),也称为插点法,是一种用于寻找给定加权图中多源点之间最短路径的算法,适用于任意类型的图和边权值均为正或负的情况。该算法基于动态规划的思想,通过对任意两个顶点之间的所有中间顶点进行遍历来计算其最短路径。具体过程是,针对每对顶点i和j,如果存在k使得从i到j的路径上经过k点比不经过k点的路径更短,则更新i到j的最短路径为经过k点的路径。在遍历完所有中间节点后,就可以得到任意两个顶点之间的最短路径。其算法流程如图3-4所示。
图 3-4 弗洛伊德算法流程
3.1.4 DFS深度优先遍历求解所有路径算法
所有路径查询模块由一个函数组成,其功能为求两景点之间所有路径。此模块需要输入起点和终点的景点编号,然后通过深度优先遍历算法能够求得所有满足起点终点是使用者所输入的景点的路径并输出。如图3-5所示。
图 3-5 所有路径查询模块流程
深度优先搜索(Depth-First Search,DFS)是一种用于图和树的遍历算法,其思想是尽可能深地搜索图的分支,直到不能再继续为止,然后回溯到前一状态,继续搜索其他分支。
在深度优先搜索中,从起始节点开始,沿着一条路径不断向前探索,直到到达末端节点为止,然后返回到最近的尚未搜索完毕的节点,继续进行搜索。如此循环,直到所有节点都被访问过为止。
深度优先搜索的基本步骤为:首先访问当前节点,并将其标记为已访问。然后对当前节点的所有相邻节点中尚未访问过的节点,依次进行深度优先搜索。最后重复上述步骤,直到所有节点都被访问过为止。其算法流程如图3-6所示。
图 3-6 DFS深度优先搜索算法流程
3.1.5 删除或增加更新模块
删除或增加更新模块由下面一个函数组成,其功能为删除或增加或更新景点信息和路径信息。使用者根据模块菜单,选择输入对应功能的序号,功能 1 为增加或者更新景点信息,使用者需要输入要增加信息的景点的编号(如果景点为新增的景点编号需要在原来基础上递增)、景点名称、景点介绍。功能 2 为增加或者更新一条路径的信息,以景点编号形式输入,并赋予这条路径长度。功能3为删除景点信息,使用者只需要输入景点编号即可,程序中将该景点信息全部置 0 表示该景点已经被删除。功能 4 为删除路径信息,输入景点编号表示对应路径即可,程序中将该路径在邻接矩阵的值赋值为无穷大,表示两景点之间无路径。该模块流程如图3-7所示。
图 3-7 删除或增加更新模块流程
3.2 使用的存储结构
3.2.1 结构体类型的定义
typedef struct VexNode//景点信息结构体
{
int vertex;//景点编号
char name[20];//景点名称
char vertax_message[400];//景点介绍
}VerNode;
typedef struct maps//景点图的结构体
{
VerNode v[MAX];
int vexnum;//点数
int arcnum;//边数
int edgs[MAX][MAX];//邻接矩阵
}AdjList;
结构体应用题目:校园导游程序。
结构体类型成员介绍:
(1)int vertex:景点的编号
(2)char name[20]:景点的名称
(3)char vertax_message[400]:景点的介绍信息
(4)int vexnum:图的点数
(5)int arcnum:图的边数
(6)int edgs[MAX][MAX]:邻接矩阵
3.2.2 全局变量与符号常量
- 全局变量有:
int dist[MAX][MAX];///距离
int path[MAX][MAX];///路径
int Stack[MAX];///路径栈
int top;///栈顶
int counts;///记录路径数
int vertex;//景点编号
char name[20];//景点名称
char vertax_message[400];//景点介绍
int vexnum;//点数
int arcnum;//边数
int edgs[MAX][MAX];//邻接矩阵
int visited[MAX];
应用题目:校园导游程序。
- 符号常量有:
#define INF 9999999
#define MAX 30
应用题目:校园导游程序
3.2.3 函数原型、功能及其参数的意义
表3-1函数简介
函数原型 | 函数功能 | 函数参数及其意义 |
void create_vertex(AdjList &GL); | 初始化校园景点及景点信息函数 | 参数GL是一个AdjList类型的结构体引用,用来表示校园景点图。 |
void Init_Creat_maps(AdjList & GL); | 初始化校园景点图函数 | 参数GL是一个AdjList类型的结构体引用,用来表示校园景点图。 |
void Dis_map(); | 展示校园景点图 | ...... |
void add_message(AdjList &GL); | 更新或添加或删除校园景点及路径信息函数 | 参数GL是一个AdjList类型的结构体引用,用来表示校园景点图。 |
void find_message(AdjList GL); | 查询景点信息函数 | 参数GL是一个AdjList类型的结构体引用,用来表示校园景点图。 |
void Floyd(AdjList GL); | 弗洛伊德求最短路径 | 参数GL是一个AdjList类型的结构体引用,用来表示校园景点图。 |
void Floyd_print(int s, int e,AdjList GL); |