[问题描述]
运用Dijkstra算法求最短路径。
1、将导游图看作一张带权无向图,顶点表示公园的各个景点,边表示各景点之间的道路,边上的权值表示距离,选择适当的数据结构。
2、求大门到各个景点之间的一条最短路径。

#include<iostream>
#include<string>using namespace std;#define MAX 1000000  //表示极大值∞
#define max 10bool S[max];   //记录从源点V0到终点Vi是否已经确定为最短路径,确定了记true,否则记false
int Path[max]; //记录从源点V0到终点Vi的当前最短路径上终点Vi的直接前驱顶点序号,若V0到Vi之间有边前驱为V0否则为-1
int D[max];  //记录源点到终点之间最短路径的长度,存在记V0到Vi的边的权值,否则记为MAX   typedef struct
{string vexs[max];       //顶点表int arcs[max][max];      //邻接矩阵        int vexnum, arcnum;    //图当前点数和边数}AMGraph;//利用迪杰斯特拉算法求最短路径
void ShortestPath_DIJ(AMGraph &G, int v0)
{//使用迪杰斯特拉算法求有向网G中的V0 定点到其余顶点的最短路径int n = G.vexnum;//顶点数for (int v = 0; v < n; v++)//n个顶点依次初始化{S[v] = false;//S初始化为空集D[v] = G.arcs[v0][v];//将v0到各个终点的最短路径长度初始化为边上的权值if (D[v] < MAX)Path[v] = v0;//如果v0和v之间有边,则将v的前驱初始化为v0elsePath[v] = -1;//如果v0和v之间无边,则将v的前驱初始化为-1}S[v0] = true; //将v0加入sD[v0] = 0;//源点到源点的权值为0//---------初始化结束,开始主循环,每次求得v0到某个顶点的最短路径,将v加到S数组for (int i = 1; i < n; i++)//依次对其余n-1个顶点进行计算{int    min = MAX;int v = v0;for (int w = 0; w < n; w++){if (!S[w] && D[w] < min){//选择一条当前最短路径,终点为vv = w;min = D[w];}S[v] = true;//将v加到s集合中for (int w = 0; w < n; w++){//更新从v0出发到集合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}}}}
}//背景函数
void backGround()
{cout << "|*****************************************************************|" << endl;cout << "    |---------------------------软院地图--------------------|"     << endl;cout << "|*****************************************************************|" << endl;cout << "|           ⑦                                          单位:米  |" << endl;cout << "|         行政楼                                                  |" << endl;cout << "|            ◎                                      ⑧           |" << endl;cout << "|           ↗↖                                   九,十栋        |" << endl;cout << "|  ③  200╱    ╲                                   ◎           |" << endl;cout << "|  大   ↙        ╲ 150                            ↗ ↖         |" << endl;cout << "|  门 ◎            ╲       ①               160 ╱     ╲ 200   |" << endl;cout << "|      ↖150          ╲    软件          ⑥    ╱         ╲     |" << endl;cout << "|    ④  ↘    140      ↘   楼   200  一食堂 ↙     230     ↘   |" << endl;cout << "|   操场   ◎-------------→◎←--------------→◎←---------→◎ |" << endl;cout << "|            ↖         ↗ ↖              ↗ ↖             ↗② |" << endl;cout << "|          100 ╲     ╱     ╲ 125      ╱     ╲ 150     ╱  二 |" << endl;cout << "|                ↘ ↙ 100     ╲      ╱135      ╲     ╱145 食 |" << endl;cout << "|                  ◎            ↘  ↙             ↘ ↙      堂 |" << endl;cout << "|            ⑨天龙人学院          ◎                 ◎          |" << endl;cout << "|                             ⑩ 六栋           ⑤  遗址          |" << endl;cout << "|                                                                 |" << endl;cout << "|*****************************************************************|" << endl;}//主菜单
void menu()
{cout << "|*****************************************************************|" << endl;cout << "|----------------------------软院导游小程序-----------------------|" << endl;cout << "    |*********************************************************|" << endl;cout << "        |--------------------1-地点信息查询--------------|" << endl;cout << "        |--------------------2-最短路径查询--------------|" << endl;cout << "        |--------------------3-显示软院视图--------------|" << endl;cout << "        |------------------- 4-退出导游程序------ -------|" << endl;cout << "|*****************************************************************|" << endl;cout << ">>>请选择:";
}//景点信息查询二级菜单
void jmenu()
{cout << "|*****************************************************************|" << endl;cout << "    |-------------------------地点信息查询------------------------|" << endl;cout << "    |***********************************************************|" << endl;cout << "      |----------------------1-软件楼介绍---------------------| " << endl;cout << "      |----------------------2-二食堂介绍---------------------| " << endl;cout << "      |----------------------3-大门介绍-----------------------| " << endl;cout << "      |----------------------4-操场介绍-----------------------| " << endl;cout << "      |----------------------5-遗址介绍-----------------------| " << endl;cout << "      |----------------------6-一食堂介绍---------------------| " << endl;cout << "      |----------------------7-行政楼介绍---------------------| " << endl;cout << "      |----------------------8-九,十栋介绍--------------------| " << endl;cout << "      |----------------------9-天龙人学院介绍-----------------| " << endl;cout << "      |--------------------- 10-六栋介绍----------------------| " << endl;cout << "|*****************************************************************|" << endl;cout << ">>>请要查询的地点编号:";
}//最短路径查询二级菜单
void pmenu()
{cout << "|*****************************************************************|" << endl;cout << "    |-------------------------最短路径查询------------------------|" << endl;cout << "    |*******************此处为大门到各点最短路径******************|" << endl;cout << "      |----------------------1-软件楼-----------------------| " << endl;cout << "      |----------------------2-二食堂-----------------------| " << endl;cout << "      |----------------------3-大门-------------------------| " << endl;cout << "      |----------------------4-操场-------------------------| " << endl;cout << "      |----------------------5-遗址-------------------------| " << endl;cout << "      |----------------------6-一食堂-----------------------| " << endl;cout << "      |----------------------7-行政楼-----------------------| " << endl;cout << "      |----------------------8-九,十栋----------------------| " << endl;cout << "      |----------------------9-天龙人学院-------------------| " << endl;cout << "      |--------------------- 10-六栋------------------------| " << endl;cout << "|*****************************************************************|" << endl;cout << ">>>请要查询的地点编号:";//
}int main()
{//初始化操作AMGraph amg = { { "软件楼","二食堂","大门","操场","遗址","一食堂",    "行政楼",    "九,十栋",   "天龙人学院", "六栋" },//-1代表两边不相连,权值无限大//邻接矩阵   /* 软  二  门  场  遗  一  政  九  天  六*/    {{MAX,MAX,MAX,140,MAX,200,150,MAX,100,125 },{MAX,MAX,MAX,MAX,145,230,MAX,100,MAX,MAX },{MAX,MAX,MAX,150,MAX,MAX,200,MAX,MAX,MAX },{140,MAX,150,MAX,MAX,MAX,MAX,MAX,100,MAX },{MAX,145,MAX,MAX,MAX,150,MAX,MAX,MAX,MAX },{200,230,MAX,MAX,150,MAX,MAX,160,MAX,135 },{150,MAX,200,MAX,MAX,MAX,MAX,MAX,MAX,MAX },{MAX,200,MAX,MAX,MAX,160,MAX,MAX,MAX,MAX },{100,MAX,MAX,100,MAX,MAX,MAX,MAX,MAX,MAX },{125,MAX,MAX,MAX,MAX,135,MAX,MAX,MAX,MAX }},10,14};int f, ff;int start, end;while (true){cout << endl;menu();cin >> f;if (f == 1){jmenu();cin>>ff;cout << "|-----------------------地点介绍-------------------| " << endl;if (ff == 1)cout << "暂无" << endl;else if (ff == 2)cout <<"                       暂无" << endl;else if (ff == 3)cout <<"                       暂无" << endl;else if(ff == 4)cout <<"                       暂无" << endl;else if (ff == 5)cout <<"                       暂无" << endl;else if (ff == 6)cout <<"                       暂无" << endl;else if (ff == 7)cout <<"                       暂无" << endl;else if (ff == 8)cout <<"                       暂无" << endl;else if (ff == 9)cout <<"                       暂无" << endl;else if (ff == 10)cout <<"                       暂无" << endl;cout << "|-------------------------------------------------|" << endl;}else if (f == 2){pmenu();cin  >> end;ShortestPath_DIJ(amg, 3 - 1);int temp = end-1;int temp1, temp2;int flag[max], m = 0;cout << "从" << amg.vexs[3 - 1] << "到" << amg.vexs[end - 1] << "最短路径为:" ;while (temp!= -1){flag[m++] = temp;temp1 = temp ;temp2 = Path[temp1];temp = temp2;}for (int i = m-1; i >= 0; i--){cout <<amg.vexs[flag[i]] << "->";}cout << endl;cout << "最短路径值为:" << D[end - 1] <<"米"<< endl;}else if (f == 3){backGround();}else if (f == 4){cout << ">>>退出成功!" << endl;exit(0);}}
}

实验结果

数据结构(C语言) 实验---图及其应用相关推荐

  1. 【数据结构C语言版】课程实验-图的应用

    数据结构C语言版 - 图的应用 前言: 大二本科计算机科学与技术程序员一枚,总结几篇课后实验内容,希望可以帮助到大家. 软件:Devc++ 实验目的: 通过实验掌握图的基本存储原理,能够利用图模型存储 ...

  2. 数据结构c语言版实验报告2,数据结构(C语言版) 实验报告 (2)

    <数据结构(C语言版) 实验报告 (2)>由会员分享,可在线阅读,更多相关<数据结构(C语言版) 实验报告 (2)(15页珍藏版)>请在人人文库网上搜索. 1.数据结构(C语言 ...

  3. 数据结构实验之图论九:最小生成树_每天5分钟用C#学习数据结构(25)图 Part 6

    [基础知识]| 作者 / Edison Zhou 这是恰童鞋骚年的第221篇原创文章 上一篇介绍了非连通图如何实现遍历,本篇我们再来看看生成树与最小生成树,以及实现最小生成树的一个算法:Prim算法. ...

  4. 【数据结构(C语言)】数据结构-图

    图 文章目录 图 一.基本概念 1.图的定义 2.约定符号 3.分类 4.子图 5.路 6.其他术语 7.ADT 二.存储结构 1.邻接矩阵(数组) 2.邻接表 三.基本算法 1.遍历 2.求无向图的 ...

  5. 数据结c语言约瑟夫环实验报告,数据结构约瑟夫环实验报告.doc

    数据结构约瑟夫环实验报告.doc 数据结构与算法设计约瑟夫环实验报告实验一专业物联网工程班级物联网1班学号15180118姓名刘沛航一. 实验目的 1.熟悉VC环境,学习使用C语言利用链表的存储结构解 ...

  6. 数据结构(廿五) -- C语言版 -- 图 - 图的遍历 -- 邻接矩阵 - 深度/广度优先遍历/搜索(DFS、BFS)

    内容预览 零.读前说明 一.概 述 二.深度优先遍历(DFS) 2.1.无向图的遍历过程 2.2.有向图的遍历过程 2.3.总结说明 2.4.实现源代码 三.广度优先遍历(BFS) 3.1.广度优先的 ...

  7. 数据结构(廿六) -- C语言版 -- 图 - 图的遍历 -- 邻接表 - 深度/广度优先遍历/搜索(DFS、BFS)

    内容预览 零.读前说明 一.深度优先遍历 1.1.深度优先的遍历过程 1.2.深度优先的遍历实现代码 二.广度优先遍历 2.1.广度优先的遍历过程 2.2.广度优先的遍历实现代码 三.源码测试效果 3 ...

  8. c语言链表上机实验答案,数据结构全部上机实验及答案.doc

    数据结构全部上机实验及答案 淮海工学院 数据结构实验指导书 计算机软件教研室 实验1线性表的抽象数据类型的实现 实验目的 1)掌握线性表的顺序存储结构和链式存储结构: 2)熟练掌握顺序表和链表基本算法 ...

  9. 【数据结构 图】数据结构实验--图及其应用

    数据结构实验–图及其应用 (代码有一些纰漏 仅供自己后期修改保存用) 数据结构上机实验 题目:设计并验证如下算法: 带权图采用邻接表表示,实现无向图的广度优先搜索BFS与有向图的深度优先搜索DFS. ...

  10. 舞伴配对问题c语言实训报告,C语言数据结构队列实现舞伴匹配(数据结构第二次实验)...

    C语言实验作业 题目如下: 课程名称:数据结构 实验目的: 1.掌握队列的定义及实现: 2.掌握利用队列的基本操作. 实验要求: 1.    使用链式结构完成队列的各种基本操作: 2.    补充完善 ...

最新文章

  1. c++在txt中每行写入数据和每行输出
  2. 51单片机(STC89C52RC) IO扩展实验
  3. SQL语言之操作数据(Oracle)
  4. ABAP语言常用的系统字段及函数
  5. Android之的性能优化方法
  6. 初二计算机辅导记录,信息技术指导老师的讲课笔记十篇(2)
  7. java怎么指定父窗口大小_[Java教程]jQuery如何获取div距离窗口顶部或者父元素顶部的距离...
  8. Flex的TabNavigator中tab触发的事件
  9. JavaScript函数的两种声明方式(4)
  10. 《数学之美》—闪光的不一定是金子
  11. [2018.07.24 T3] 大原题
  12. cppcheck 自定义规则_Cppcheck 用法-编码规范
  13. Word默认打开方式不对,图标空白的修复方法
  14. html的表格使用函数,表格函数column是什么意思
  15. raw 图像转成fits格式图像
  16. 数字逻辑电路——第四章 组合逻辑电路
  17. AWS免费账号取消步骤
  18. Gitea在windows平台的安装和简单使用教程
  19. 从头到脚说单测——谈有效的单元测试(上篇)
  20. 中华万年历 1.42版本已发布

热门文章

  1. latex如何绘制标准三线表 lllegal charactor in array arg 如何合并单元格?
  2. python十进制转换其他进制直到输入q结束,python二进制转换,python将十进制转为二进制,题目描述:输入一个整...
  3. 对比学习Contrastive Learning
  4. 黏土基纳米复合水凝胶/PVA/PAA/BC复合水凝胶/聚乙烯醇PVA基复合水凝胶/壳聚糖/液晶(CS/LC)复合水凝胶/PVA/季铵盐壳聚糖复合水凝胶/有机-无机纳米复合水凝胶定制
  5. Python3 基础知识
  6. 一个故事弄懂域名解析
  7. linux中shell命令行缩进,Linux下几个实用的bash命令 | 旺旺知识库
  8. 弄懂这56个Python使用技巧,掌握Python高效开发
  9. 手机cpu性能天梯图2022 手机cpu性能排行2022 手机cpu哪个好
  10. 防刷新网站访问量计数器