[问题描述]
运用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. reg类型变量综合电路_verilog中reg和wire类型的区别
  2. 超过AttGAN,谷歌推出生成文本到图像的新框架 TReCS
  3. 活着不易,5G时代终端厂商的路在何方?
  4. SQL多表连接查询(具体实例)
  5. C#中的String编码转换
  6. IE下iframe跨域session和cookie失效问题的解决方案
  7. c语言函数参数类型格式化,格式化输出的几种方法 主要介绍format函数的用法
  8. airpods2使用_如何使用AirPods和AirPods Pro:完整指南
  9. win11打开控制面板闪退怎么办 Windows11控制面板闪退的解决方法
  10. Go基础系列:接口类型断言和type-switch
  11. java .jpackage_jpackage安装Java原生本机应用的新工具
  12. fairygui 与 spine动画的适配处理
  13. Qt开发 之 删除文件或文件夹到回收站(详解)
  14. 盒子综合案例——德云社十八愁与宠物知识栏
  15. 过渡属性transition详解
  16. 从前端到全栈-基础能力-js-异步编程
  17. 计算机网络技术个人简历范文,计算机网络技术专业个人简历自我评价范文
  18. AUC的相关知识及K-S曲线和K-S值介绍
  19. 知识付费系统源码下载带课程数据+一键同步功能和更新设置
  20. js脚本混淆加密(转载)

热门文章

  1. 梦幻西游手游什么服务器稳定,《梦幻西游手游》ios玩哪个区好 ios区服选择推荐...
  2. shell脚本学习(十三)——for循环语句
  3. 欢乐的票圈重构——九宫格控件(上)
  4. 页面遇到的APP兼容性问题合集
  5. Word中的插入页眉 ?Word中页眉横线如何删除?
  6. 聊聊Hibernate和Mybatis的区别
  7. Win10系统pin码忘记了?
  8. 微信小程序登录注册功能(超详细)
  9. visio的图在word中空白处太大的问题
  10. 调用JavaAPI发送传真