写在前面
本人大一时写的数据结构课程设计。
里面还有一些bug。
例如,增加或者删除某个景点的时候,校园地图的仿真界面需手动修改,无法实现自动修改;未设计人行道,车道,景色等级等细节。Tarjan找关节点的算法未实现。(代码里面有Tarjan算法,没有写对)
注:
文件只设置了图书馆节点的详细信息,其他节点未设置。
题目要求
【问题描述】
设计一个校园导游程序,为来访的客人提供各种信息查询服务。
【基本要求】
(1) 设计你所在学校的校园平面图,所含景点不少于10个。以图中顶点表示校内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息。
(2)为来访客人提供图中任意景点相关信息的查询。
(3)为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。
【实现提示】
一般情况下,校园的道路是双向通行的,可设校园平面图是一个无向网。顶点和边均 含有相关信息。
【选作内容】
(1) 求校园图的关节点。
(2) 提供图中任意景点问路查询 , 即求任意两个景点之间的所有路径。
(3) 提供校园图中多个景点的最佳访问路线查询 , 即求途经这多个景点的最佳 ( 短 )路径。
(4) 校园导游图的景点和道路的修改扩充功能。
(5) 扩充道路信息 , 如道路类别 ( 车道、人行道等 ) 、沿途景色等级 , 以至可按客人所需分别查询人行路径或车行路径或观景路径等。
(6) 扩充每个景点的邻接景点的方向等信息 , 使得路径查询结果能提供详尽的导向信息。
(7) 实现校园导游图的仿真界面。
部分代码
函数声明
//----------------------------函数声明-------------------------------//
CpMap CreatMap(); //建图
void Openning(); //初始菜单
void Manue_1(); //子菜单
void Print_Map();
void Operation_1(); //菜单功能1-5
void Operation_2(CpMap map);
void Operation_3(CpMap map);
void Operation_4(CpMap map);
void Operation_5(CpMap map);
void Operation_6(CpMap map);
void Operation_7(CpMap& map);
int Find_num(CpMap map,string*x, string y); //找景点在邻接表中的下标(哈希思想)
int Input_Error1(int x);
int Input_Error2(int x, int y); //景点名称输入错误报错提示
void LinkNode(int x, int y, CpMap& Map, int dis); //连接两个顶点 无向图连接(a,b),(b,a)
void CreatEdge(CpMap* P_map); //在地图上创建边
void Print(CpMap map); //打印邻接表
void DFS(CpMap map, int x, int y); //深度优先搜索 + 回溯
void Dijikstra(CpMap map, int x, int y);
void Floyed(CpMap map);
void Floyed_Print(CpMap map, int x, int y);
void Tarjan(CpMap map, int x); //Tarjan找关节点
void Delet_Edge(CpMap& map, int x, int y); //删除边
int Distance[Maxx], Path_dij[Maxx], Visited[Maxx];
int D_f[25][25], Path_f[25][25];
int Start, D[Maxx], Visited_DFS[Maxx], if_DFS[Maxx];
deque<int> Path; //双向队列
int Dfn[Maxx], Low[Maxx], Par[Maxx], ap[Maxx]; //Dfn[] (时间戳)深搜得到的节点序列
int cnt, ans; //Low[x] 顶点x的追溯值
queue<int> Tar;
int if_Floyed = 0;
部分功能展示
菜单
所有路径查询(两个节点之间)
void Operation_5(CpMap map) {
string a, b; //DFS
cout << "请输入查询的两个景点(东田径场 玉壶山):";
cin >> a >> b;
int ai = Find_num(map, view_spot,a), bi = Find_num(map, view_spot,b);
Start = ai;
while (Input_Error2(ai, bi)) { //判断是否输入错误
cin >> a >> b;
Start = ai = Find_num(map, view_spot,a);
bi = Find_num(map, view_spot,b);
}
DFS(map, ai, bi);
}
实现思路大概 找对应需求所需的图论算法,写出来就好了。
代码里有详细注释,需要自取。