大二数据结构实验之校园导游咨询程序(C++)
来源:互联网 发布:水利工程计价软件 编辑:程序博客网 时间:2024/04/28 19:54
校园导游咨询
【问题描述】
设计一个校园导游程序,为来访的客人提供各种信息查询服务。
【基本要求】
- 设计你的学校的校园平面图,所含景点不少于10个。以图中顶点表示学校各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息。
- 为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。
- 为来访客人提供图中任意景点相关信息的查询。
【测试数据】
由读者根据实际情况指定。
【实现提示】
一般情况下,校园的道路是双向通行的,可设校园平面图是一个无向网。顶点和边均含有相关信息。
#include <iostream>#include <algorithm>#include <string>using namespace std;#define OK 1#define ERROR 0#define MaxInt 32767 //极大值#define MVNum 50 //最大顶点数typedef int Status;typedef string VerTexType; //假设顶点的数据类型为string类型typedef string InfoType;typedef int ArcType; //假设边的权值类型为整型bool visited[MVNum]; //访问标志数组,值为"false"时代表该顶点没被访问,值为"true"时代表该顶点已被访问typedef struct vex{ VerTexType name; InfoType otherinfo;}vex, *vexptr;//图的邻接矩阵存储表示typedef struct{ vex vexs[MVNum]; //顶点表 ArcType arcs[MVNum] [MVNum]; //邻接矩阵 int vexnum, arcnum; //图的当前点数和边数}AMGraph; //获取顶点位置:若G中存在顶点u,则返回该顶点在图中的位置;否则返回其他信息int LocateVex(AMGraph G, VerTexType u){ int index = -1; //原始下标,没找到元素返回-1 for(int i = 0; i < G.vexnum; i++){ //遍历顶点数组 if(u == G.vexs[i].name){ index = i; //记录元素下标 } } return index; //返回下标}//采用邻接矩阵表示法创建无向网G,表示地图Status CreateUDN(AMGraph &G){ G.vexnum = 13; G.arcnum = 18; G.vexs[0].name = "菊苑饭堂"; G.vexs[0].otherinfo = "菊苑饭堂简介"; G.vexs[1].name = "梅苑饭堂"; G.vexs[1].otherinfo = "梅苑饭堂简介"; G.vexs[2].name = "兰苑饭堂"; G.vexs[2].otherinfo = "兰苑饭堂简介"; G.vexs[3].name = "商中"; G.vexs[3].otherinfo = "商中简介"; G.vexs[4].name = "图书馆"; G.vexs[4].otherinfo = "图书馆简介"; G.vexs[5].name = "理科南楼"; G.vexs[5].otherinfo = "理科南楼简介"; G.vexs[6].name = "理科北楼"; G.vexs[6].otherinfo = "理科北楼简介"; G.vexs[7].name = "文新楼"; G.vexs[7].otherinfo = "文新楼简介"; G.vexs[8].name = "文清楼"; G.vexs[8].otherinfo = "文清楼简介"; G.vexs[9].name = "文俊东楼"; G.vexs[9].otherinfo = "文俊东楼简介"; G.vexs[10].name = "文俊西楼"; G.vexs[10].otherinfo = "文俊西楼简介"; G.vexs[11].name = "行政东楼"; G.vexs[11].otherinfo = "行政东楼简介"; G.vexs[12].name = "行政西楼"; G.vexs[12].otherinfo = "行政西楼简介"; for(int i = 0; i < G.vexnum; ++i){ //初始化邻接矩阵,边的权值均置为极大值MaxInt for(int j = 0; j < G.vexnum; ++j){ G.arcs[i][j] = MaxInt; } } G.arcs[0][2] = 200; G.arcs[0][3] = 300; G.arcs[1][2] = 200; G.arcs[1][3] = 1000; G.arcs[2][3] = 800; G.arcs[3][4] = 400; G.arcs[3][8] = 400; G.arcs[4][5] = 530; G.arcs[4][6] = 540; G.arcs[4][8] = 350; G.arcs[4][11] = 250; G.arcs[4][12] = 250; G.arcs[5][6] = 20; G.arcs[7][8] = 10; G.arcs[7][9] = 30; G.arcs[7][10] = 30; G.arcs[9][10] = 10; G.arcs[11][12] = 50; G.arcs[2][0] = 200; G.arcs[3][0] = 300; G.arcs[2][1] = 200; G.arcs[3][1] = 1000; G.arcs[3][2] = 800; G.arcs[4][3] = 400; G.arcs[8][3] = 400; G.arcs[5][4] = 530; G.arcs[6][4] = 540; G.arcs[8][4] = 350; G.arcs[11][4] = 250; G.arcs[12][4] = 250; G.arcs[6][5] = 20; G.arcs[8][7] = 10; G.arcs[9][7] = 30; G.arcs[10][7] = 30; G.arcs[10][9] = 10; G.arcs[12][11] = 50; return OK;}//输出景点介绍void PrintInfo(AMGraph G, VerTexType a){ for(int i = 0; i < G.vexnum; i++){ if(G.vexs[i].name == a){ cout<< G.vexs[i].otherinfo << endl; return; } } cout << "没有此景点。" << endl; return;} //景点a1到景点a2的最短路径void ShortestPath(AMGraph G, VerTexType a1, VerTexType a2){ int v, w; int n = G.vexnum; //n为G中顶点个数 bool S[n]; //记录从源点v0到终点vi是否已被确定最短路径长度,true表示确定,false表示尚未确定 int Path[n]; //记录从源点v0到终点vi的当前最短路径上vi的直接前驱顶点序号 int D[n]; //记录从源点v0到终点vi的当前最短路径长度 int v1 = LocateVex(G, a1); int v2 = LocateVex(G, a2); for(v = 0; v < n; ++v){ //n个顶点依次初始化 S[v] = false; //S初始化为空集 D[v] = G.arcs[v1][v]; //将v0到各个终点的最短路径长度初始化为弧上的权值 if(D[v] < MaxInt) Path[v] = v1; //如果v0和v之间有弧,则将v的前驱置为v0 else Path[v] = -1; //如果v0和v之间无弧,则将v的前驱置为-1 } S[v1] = true; //将v0加入S D[v1] = 0; //源点到源点的距离为0/*----------初始化结束,开始主循环,每次求得v0到某个顶点v的最短路径,将v加到S集----------*/ for(int i = 1; i < n; ++i){ //对其余n-1个顶点,依次进行计算 int min = MaxInt; for(w = 0; w < n; ++w){ if(!S[w] && D[w] < min){ v = w; min = D[w]; //选择一条当前最短路径,终点为v } } S[v] = true; //将v加入S for(w = 0; w < n; ++w){ //更新从v_0出发到集合V-S上所有顶点的最短路径长度 if(!S[w] && (D[v] + G.arcs[v][w] < D[w])){ D[w] = D[v] + G.arcs[v][w]; //更新D[w] Path[w] = v; //更改w的前驱为v } } } int a = v2; cout<< G.vexs[a].name; while(Path[a] != -1){ cout<< "<-" << G.vexs[Path[a]].name; a = Path[a]; }} int main(){ AMGraph G; int m; VerTexType v1, v2; VerTexType b; CreateUDN(G); while(1){ cout << "**************************校园导游咨询***************************" << endl; cout << "* 【1】. 问路查询 *" << endl; cout << "* 【2】. 景点信息查询 *" << endl; cout << "* 【3】. 退出程序 *" << endl; cout<< "*****************************************************************" << endl; cin>> m; switch(m){ case 1:{ VerTexType v1, v2; cout << "请输入起点和终点:"; cin>> v1 >> v2; cout << v1 << "到" << v2 << "的最短路径为:"; ShortestPath(G, v1, v2); cout<< endl; system("pause"); system("cls"); break; } case 2:{ cout << "请输入要查询的景点名称:"; cin>> b; PrintInfo(G, b); system("pause"); system("cls"); break; } case 3: return 0; } } }
阅读全文
0 0
- 大二数据结构实验之校园导游咨询程序(C++)
- 数据结构-校园导游咨询系统
- 数据结构-校园导游咨询系统…
- 校园导游咨询——数据结构课程设计
- 校园导游咨询(图的应用)
- 校园导游咨询
- 校园导游咨询
- 校园导游咨询系统
- 校园导游咨询
- 数据结构课设--4校园导游咨询(图的应用)
- 大二数据结构实验之散列表实现通讯录(C++)
- 校园导游程序(适合大一,大二的同学看看)
- 数据结构课程设计校园导游(吃货版)
- 校园导游程序
- 校园导游系统 数据结构课程设计
- 数据结构项目-校园导游系统
- C语言简单校园导游程序的设计与实现
- C项目-校园导游系统
- 【scikit-learn】加载示例数据集
- 最简求子序列最大和
- 数据结构学习笔记(三)--线性表的实现代码(未完)
- 2017多校训练赛第九场 HDU 6170 Two String(dp)
- 4. Median of Two Sorted Arrays
- 大二数据结构实验之校园导游咨询程序(C++)
- iOS 提交二进制文件报错:Missing required icon file
- MySQL InnoDB中唯一索引和非唯一索引时的加锁情况
- 顺序表的基本操作实现及其应用(实验1)
- SpringMVC 做服务器,httpClient做客户端请求的简单例子
- lintcode 44.最小子数组
- Git 生成SSH 公钥
- Jar发布到MAVEN中央仓库实践
- SLAM算法