一:算法历史
  迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。
二:算法思想
  按路径长度递增次序产生算法:
  把顶点集合V分成两组:
  (1)S:已求出的顶点的集合(初始时只含有源点V0)
  (2)V-S=T:尚未确定的顶点集合
  将T中顶点按递增的次序加入到S中,保证:
  (1)从源点V0到S中其他各顶点的长度都不大于从V0到T中任何顶点的最短路径长度
  (2)每个顶点对应一个距离值
  S中顶点:从V0到此顶点的长度
  T中顶点:从V0到此顶点的只包括S中顶点作中间顶点的最短路径长度
  依据:可以证明V0到T中顶点Vk的,或是从V0到Vk的直接路径的权值;或是从V0经S中顶点到Vk的路径权值之和
三:应用举例
  (1)题目:编写一个校园导游程序,为来访的客人提供各种信息查询服务。
    主要功能:1.设计学校的校园平面图,所含景点不少于10个:顶点表示景点,边表示路径等;
         2.为客人提供图中任意景点相关信息的查询;
         3.为客人提供图中任意景点的问路查询,即查询人以景点间的一条最短路径。
      要求:1.设计一个主界面;
              2.设计功能菜单,供用户选择
              3.有一定的实用性。
  (2)设计思路:
    1、该题主要有算法思路以及程序的逻辑思路,首先从逻辑思路讲,进入程序,首先设计一个主菜单,选项有景点信息查询,最短路径查询以及显示景点的平面视图三个子菜单,然后根据用户的输入选择的子菜单前的编号,分进入不同的子菜单;该功能是由if….else if…. 语句实现。在景点信息查询和最短路径查询子菜单下还有二级子菜 单,都是列 出所有景点并在前面编号,查询景点信息时,输入景点前面的编号即可,查询最短路径时,先输入起点的编号,再输入终点的编号。而显示景点视图则调用景点平面图函数即可显 示。
    2、算法思路主要是迪杰斯特拉算法的思路,利用迪杰斯特拉算法求最短路径。
    3、先定义好图的储存结构,本题采用邻接矩阵的方式来表示图,并在主函数中初始化该图;
    4、定义三个全局一维数组,一个bool类型数组S[]用来记录从v0到vi是否已经确定了最短路径,是则记S[i]=true,否记S[i]= flase;一个int 类型数组Path[]用来记录从v0到vi的当前最短路径上的vi的直接前驱顶点编号,若v 到vi之间有边则记Path[i] = v的编号,否则记Path[i] = -1;最后一个数组D[]用来记录从v0到vi之间的最短路径长度,存在则记v0到vi之间边的权值或者权值和,否则记为MAX
    5、定义一个求最短路径的函数,传入的参数为图和起点,首先进行初始化工作,初始化S[]数组全为false,D[]数组初始化为起点到各个顶点的权值,Path[]数组初始化为起点是否与各顶点有边,有则记v0否则记-1;
    6、然后进行n-1次for循环,找出vo到其余n-1个顶点之间的最短路径,比较当前D[]数组中最小值,找到最小值的编号v,该编号就是从v0出发到所有顶点中距离最短的顶点编号,然后把S[v]的值置为true。说明从v0出发到顶点v已经找到最短路径;
    7、接着就要更新D[]数组,因为D[]数组是记录最短路径的,现在已经找到了一个顶点的最短路径,已该顶点v为中间点,判断从该顶点v出发到剩下的顶点的路径长度加上该点到v0的路径长度是否小于直接从v0出发到其余顶点的路径长度,如果小于,则更新D[i]为以该顶点v为中间点求得的路径长度。更新Path[i] = v;即i的前驱不再是v0而是v;
    8、循环(6)(7)两步n-1次即可得到D[]数组,输出D[]数组既是v0到所有顶点的最短路径长度;

  (3)源代码:

#include<iostream>
#include<fstream>
#include<string>
using namespace std;
/***作者:Dmego*时间:2016-12-12*/
#define MAX 1000000  //表示极大值∞
#define max 10
bool 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 << ">>>请依次输入起点编号和终点编号:";
}
void 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;       //景点信息从文件中读取ifstream outfile("schooltravel.txt", ios :: out | ios :: binary);if (!outfile){cerr << "读取景点介绍文件失败!" << endl;exit(1);}string str[max];int i = 0;while (getline(outfile, str[i++]));cout << "|-----------------------景点介绍-------------------| " << endl;if (ff == 1)cout << str[0] << endl;else if (ff == 2)cout << str[1] << endl;else if (ff == 3)cout << str[2] << endl;else if(ff == 4)cout << str[3] << endl;else if (ff == 5)cout << str[4] << endl;else if (ff == 6)cout << str[5] << endl;else if (ff == 7)cout << str[6] << endl;else if (ff == 8)cout << str[7] << endl;else if (ff == 9)cout << str[8] << endl;else if (ff == 10)cout << str[9] << endl;cout << "|-------------------------------------------------|" << endl;}else if (f == 2){pmenu();cin >> start >> end;ShortestPath_DIJ(amg, start - 1);int temp = end-1;int temp1, temp2;int flag[max], m = 0;cout << "从" << amg.vexs[start - 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);}}
}

  (4)运行截图:

                                 

schooltravel.txt下载地址:https://files.cnblogs.com/files/dmego/schooltravel.rar

C++迪杰斯特拉算法求最短路径相关推荐

  1. c语言迪杰斯特拉算法求最短路径,迪杰斯特拉 ( Dijkstra ) 最短路径算法

    迪杰斯特拉算法介绍 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径.它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本 ...

  2. Dijkstra(迪杰斯特拉)算法求单源最短路径问题

    Dijkstra(迪杰斯特拉)算法求单源最短路径问题 重要的事情说三遍:代码不是我写的!代码不是我写的!代码不是我写的! 第一个算法是严蔚敏数据结构(C语言版)上写的,第二个算法是王道数据结构上写的, ...

  3. 图解迪杰斯特拉算法(最短路径问题)

    文章目录 一.单源最短路径问题 二.迪杰斯特拉算法 2.1 什么是迪杰斯特拉算法 2.2 迪杰斯特拉算法的步骤 2.2.1 基本步骤 2.2.2 图解演示 2.3 迪杰斯特拉算法的代码实现 一.单源最 ...

  4. 迪杰斯特拉--- 模板(求最短路径/输出路径/所有路径都可以走的做法)

    迪杰斯特拉--- 模板(求最短路径/输出路径/所有路径都可以走的做法) 1.0版 #include <iostream> using namespace std;const int max ...

  5. 利用迪杰斯特拉算法求某一顶点到其余各顶点的最短路径

    [迪杰斯特拉算法思想] 设有两个顶点集合S和T,集合S中存放图中已找到最短路径的顶点,集合T存放图中剩余顶点.初始状态下,集合S中只包含源点V0.然后不断从集合T中选取到顶点V0路径长度最短的顶点Vu ...

  6. 算法与数据结构(六) 迪杰斯特拉算法的最短路径(Swift版)

    上篇博客我们详细的介绍了两种经典的最小生成树的算法,本篇博客我们就来详细的讲一下最短路径的经典算法----迪杰斯特拉算法.首先我们先聊一下什么是最短路径,这个还是比较好理解的.比如我要从北京到济南,而 ...

  7. 迪杰斯特拉算法---求解最短路径

    迪杰斯特拉算法: 按路径长度递增的次序求解最短路径的方法.从单源点出发查找与单源点连接的最小的边,把该边对应的顶点加入集合V,然后从该顶点开始与原来到其他各顶点的最短路径进行比较,若比原来的路径小,则 ...

  8. 迪杰斯特拉算法求经纬度坐标的最短路径_Postgresql构建经纬度查询两点之间的最短路径...

    前言 前段时间遇到了实际的需求,在特定的路网中查询最短路径.同时配合 Cesium 进行动态显示. 需求 动态查询两点之间的最短路径(起点固定): 查询的路径高亮显示: Cesium 对生成的路径进行 ...

  9. 迪杰斯特拉算法 php,最短路径算法

    从某顶点出发,沿图的边到达另一顶点所经过的路径中,各边上权值之和最小的一条路径叫做最短路径.解决最短路的问题有以下算法,Dijkstra算法,Bellman-Ford算法,Floyd算法和SPFA算法 ...

最新文章

  1. Guest权限突破8法(整理)
  2. java Lock 源码分析
  3. 210板wince键盘驱动分析和移植
  4. 计算机专业学硕复试未来规划,【图片】2020考研,老学长教你如何规划!【计算机考研吧】_百度贴吧...
  5. 就如何快速免费提高网站排名小结
  6. 2021-07-31mysql 登录退出
  7. 计算机辅助几何设计知识点,计算机辅助几何设计
  8. 计算机二级office公共基础知识思维导图-数据结构
  9. Java中的正则表达式
  10. Django视图模板_004
  11. 红帽linux 下qt 5.13.1 编译 mysql80驱动(内含升级gcc版本)
  12. HTML入门学习-含代码和配套资料
  13. 计算机中主频的定义,计算机的主频指的
  14. ”微信小程序“一场风暴还是过江之鲫
  15. 视频的帧率和分辨率以及码率的关系
  16. 什么牌子的护眼灯最好推荐?盘点口碑好的护眼灯品牌
  17. 站长付个人微信支付宝收款系统如何对接?
  18. PC微信3.3.0内测版(新增朋友圈功能)
  19. java.lang.IllegalArgumentException: No converter found for return value of type: class com.sail.comm
  20. 周志明论架构之道:从SOA时代到微服务时代

热门文章

  1. 验证视图状态 MAC 失败。如果此应用程序由网络场或群集承载,请确保 配置指定了相同的 validationKey 和验证算法。不能在群集中使用 AutoGenerate...
  2. archlinux安装小记
  3. python代码转换为pytorch_Pytorch中Tensor与各种图像格式的相互转化详解
  4. python错误和异常处理怎处理你知道么
  5. 看漫画学Python,屏幕前的彦祖要不要试试?
  6. java file 其他电脑上,java - Jar文件无法在另一台PC上执行
  7. 简单介绍python format格式化和数字格式化
  8. 简单介绍python连接telnet和ssh的两种方式
  9. ad 原理图差分线_usb hub原理图及pcb设计
  10. 一道关于整型提升/截断的经典练习题