本篇文章主要介绍了Dijkstra迪杰斯特拉算法的C++实现,文章包含两个部分,在第一部分中我会简单介绍迪杰斯特拉算法以及一些个人的理解,第二部分会对C++代码的逻辑进行解释。下面是我已经上传的代码资源,大家有兴趣的可以点击链接下载资源。
迪杰斯特拉算法的C++实现

迪杰斯特拉算法本质上是一个贪心算法,通过不断迭代取得局部最优解的方法,最终找到整体的最优解。迪杰斯特拉算法主要用于在有权图中计算出各节点到初始节点的最短路径。在接下来的分析中我会使用的有权图如下 :


其中,ABCDE就是我们需要遍历的节点,连接节点的弦上的数字表示了两节点之间的"距离",或称之为权重,消耗。需要注意的几点是 :

  1. 迪杰斯特拉算法适用的有权图中,节点之间的权重不要求是双向的,即 A-> B的权重和 B->A 的权重不要求相同。换而言之,有权图中节点之间的连接可以是单向的,或者在两个方向权重有所不同的。
  2. 迪杰斯特拉算法适用的有权图中,节点间连接的权重值不能是负值。

了解了迪杰斯特拉算法的一些注意点之后,我们下面来重点解释算法的实现。之前我们已经提到了,迪杰斯特拉算法多用于解决最短路径问题,对应上述有权图就是计算出所有节点到初始节点的最短距离。在下述例子中,我们默认使用A作为初始节点,目标就是找出所有节点到A的最短距离以及所经过的路径。
首先我们需要两个列表,一个visited列表用于存放已经遍历过其所有邻节点的节点,一个unvisited列表用于存放还未遍历过其所有邻节点的节点。我们会不断地进行迭代运算,直到unvisited列表为空,即所有的节点都已经访问过(遍历过其所有邻节点)。
显然初始状态,visited列表为空[],unvisited列表中包含所有的节点[A,B,C,D,E]。
然后我们需要一个列表用于记录所有节点到A节点,起始节点之间的最短距离,以及最短路径中该节点之前的节点。
第一步,初始化这个表格 :
显然A到A的距离为0,其余节点到A的距离为未知,初始化为正无穷。

节点 节点到A的距离 最短路径中该节点之前的节点
A 0
B ∞\infin∞
C ∞\infin∞
D ∞\infin∞
E ∞\infin∞

那么每一次迭代,我们需要做的,就是在unvisited列表中,选择一个到A距离最短的节点,并遍历更新其所有unvisited列表中的邻节点。
例如第一次迭代中,unvisited未访问列表中A节点到A的最短距离最短,那么我们首先就访问A所有unvisited的节点 B 和 D。简单来说,如果通过A访问B比起之前的方式要距离更短,那么我们就更新B到初始点的距离为新的最短距离,并将B之前的节点更新为A。那么在这个例子中,通过A访问B的距离为6,通过A访问D的距离为1,显然距离都比正无穷要小,则更新列表如下 :

节点 节点到A的距离 最短路径中该节点之前的节点
A 0
B 6 A
C ∞\infin∞
D 1 A
E ∞\infin∞

同时更新visited列表以及unvisited列表:
visited : [A]
unvisited : [B,C,D,E]

既然未访问列表仍然不为空,我们继续迭代,选择D作为新的访问节点,因为节点D目前到A的距离最短。那么节点D在unvisited列表中的邻节点有 B E,那么我们更新B,E的值和其原来的距离进行对比。 B : 1+2 = 3 < 6 \space  E : 1+1 = 2 < ∞\infin∞。
更新列表如下 :

节点 节点到A的距离 最短路径中该节点之前的节点
A 0
B 1+2 = 3 D
C ∞\infin∞
D 1 A
E 1+1 = 2 D

同时更新visited列表以及unvisited列表:
visited : [A,D]
unvisited : [B,C,E]
我们继续迭代,方法同上。
访问E节点,更新列表 :

节点 节点到A的距离 最短路径中该节点之前的节点
A 0
B 1+2 = 3 D
C 1+1+5 = 7 E
D 1 A
E 1+1 = 2 D

同时更新visited列表以及unvisited列表:
visited : [A,D,E]
unvisited : [B,C]

继续访问B,更新列表 :
B的唯一没有访问的邻节点为C,但A> … >B>C 的距离为 3+5=8 >7,因此C到节点A的距离不变。

节点 节点到A的距离 最短路径中该节点之前的节点
A 0
B 1+2 = 3 D
C 1+1+5 = 7 E
D 1 A
E 1+1 = 2 D

同时更新visited列表以及unvisited列表:
visited : [A,D,E,B]
unvisited : [C]
最后我们访问C,列表不变,因为C的所有邻节点都已经访问过了。
最终的结果如下 :

节点 节点到A的距离 最短路径中该节点之前的节点
A 0
B 3 D
C 7 E
D 1 A
E 2 D

通过迪杰斯特拉算法,我们可以完备地遍历所有有权图中的节点,并在最后返回一个所有节点到初始点的最短距离,以及对应的最短路径的所有节点之前的节点。之后通过不断访问最短路径中该节点之前的节点,我们就可以很简单地还原出最短路径。例如对节点C而言,C之前的节点为E,E之前的节点为D,D之前的节点为A,因此最短路径还原为A > D > E > C。

参考 :
[1] Graph Data Structure 4. Dijkstra’s Shortest Path Algorithm

[2] (熟肉)Dijkstra算法详解,轻松入门——Youtube

Dijkstra迪杰斯特拉算法 C++实现相关推荐

  1. JavaScript实现dijkstra迪杰斯特拉算法(附完整源码)

    JavaScript实现dijkstra迪杰斯特拉算法 PriorityQueue完整源代码 MinHeap.js完整源代码 Heap.js完整源代码 Comparator.js完整源代码 dijks ...

  2. C++实现Dijkstra(迪杰斯特拉)算法(附完整源码)

    C++Dijkstra迪杰斯特拉算法的实现 C++Dijkstra(迪杰斯特拉)算法的完整源码(定义,实现,main函数测试) C++Dijkstra(迪杰斯特拉)算法的完整源码(定义,实现,main ...

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

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

  4. 最短路径之Dijkstra(迪杰斯特拉)算法(无向图)

    简介      Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.由for循环可知,其时间 ...

  5. MATLAB轻松绘制地图路线——Dijkstra(迪杰斯特拉)算法最短路径规划

    文章目录 1. 地图绘制 2. 计算各节点之间的距离 3. Dijkstra(迪杰斯特拉)算法 4. 根据计算出的距离利用Dijkstra(迪杰斯特拉)算法找出指定节点之间的最短路径 工程文件(可直接 ...

  6. C语言实现Dijkstra(迪杰斯特拉)算法(附完整源码)

    Dijkstra迪杰斯特拉 Graph结构体定义 迪杰斯特拉算法完整源码(定义,实现,main函数测试) Graph结构体定义 struct Graph {int vertexNum;int **ed ...

  7. dijkstra迪杰斯特拉算法(邻接表法)

    算法简易过程: 迪杰斯特拉算法(朴素) O(n^2) G={V,E} V:点集合 E:边集合 初始化时 令 S={某源点ear}, T=V-S= {其余顶点},T中顶点对应的距离(ear, Vi)值若 ...

  8. Dijkstra(迪杰斯特拉)算法

    一.简介 迪克斯特拉算法又名Dijkstra算法(属于贪心算法).Dijkstra算法是从一节点到其余各节点最短路径计算方法. 迪杰斯特拉算法以起始点为中心向外层层扩展,直到扩展到终点为止. 算法思想 ...

  9. 算法提升:图的Dijkstra(迪杰斯特拉)算法

    目录 概念 思路 代码 概念 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路 ...

最新文章

  1. python画横条形图-用matplotlib画条形图(bar)
  2. 几个极品笑话,放松下心情
  3. 【学术相关】魔术乘法:张成奇教授40年磨一剑!
  4. python使用rabbitmq阻塞_python – Celery/RabbitMQ unacked消息阻塞队列?
  5. ctf php文件上传图片格式,CTF-WEB:文件上传
  6. Java 生成 验证码图片
  7. 假币问题(二分法与三分法实现)
  8. 人工智能对医疗和健康产业的冲击和革命——意识上传技术展望
  9. 在内存只有10M的空间中申请一块5M的数组空间,会导致OOM吗?
  10. latex里图片大小如何调整_如何使Latex中的图片放大依然清晰
  11. CAD标注中全局比例(DIMSCALE)与比例因子(DIMLFAC)区别
  12. 一个屌丝程序猿的人生(八十)
  13. Matter理论介绍-通用-1-03:桥接器-数据结构
  14. 【阅读笔记】提升example-based SISR七个技巧
  15. IP地址,子网掩码以及子网掩码的划分
  16. java基础(1)—1
  17. 计算机毕业设计SSM 校园疫情防控系统【附源码数据库】
  18. ESP32学习8:WIFI
  19. Vmware 安装 RedFlag-6.x For Linux
  20. Sublime初始配置

热门文章

  1. java foreach和for循环区别_java相关:老生常谈foreach(增强for循环)和for的区别
  2. icem密度盒怎么设置_怎么做好火灾自动报警系统施工安装?
  3. 160 - 25 CodeZero.1
  4. 栈与队列在SGI STL的底层实现
  5. 形态学操作——击中击不中变换
  6. javascript运算符_JavaScript中!=或!==运算符之间的区别
  7. Python---实验九
  8. linux 如何打包分区文件,Linux基础------文件打包解包---tar命令,文件压缩解压---命令gzip,vim编辑器创建和编辑正文件,磁盘分区/格式化,软/硬链接...
  9. centos升级之共享文件夹
  10. ubuntu修改ls显示目录的颜色