Dijkstra(迪杰斯特拉)算法的思想是广度优先搜索(BFS) 贪心策略。

是从一个顶点到其余各顶点的最短路径算法,节点边是不各自不同的权重,但都必须是正数

如果是负数,则需要 Bellman-Ford 算法

如果想求任意两点之间的距离,就需要用 Floyd 算法

求节点0 -> 4 的最短路径

  • 每次从未标记的节点中选择距离出发点最近的节点,标记,收录到最优路径集合中
  • 计算刚加入节点A的邻近节点B的距离(不包括标记的节点),若(节点A的距离 + 节点A到节点B的边长)< 节点B的距离,就更新节点B的距离和前序节点

初始状态

节点 0 1 2 3 4 5 6 7 8 备注
最优节点 每一步,找出未标记的节点中,最短的距离,标记为最优节点
出发节点 当前节点,到每个节点的距离,刚开始,所有的节点都认为是 ∞ 无穷大
前序点 为了记录最短路径,需要记录每个节点的前序节点

从0出发

节点 0 1 2 3 4 5 6 7 8
最优节点
0 出发 0
前序点

首先,节点0的距离是0,所有节点中距离最短的是它自己,0为最优路径中的节点

更新0邻近节点1、7

从0点出发,到 相邻的节点 1、7

0->1 = 4 , 节点 1 此时为 ∞,因此 节点 1 的 距离 标为 4,前序节点为 0

0->7 = 8 , 节点 7 此时为 ∞,因此 节点 7 的 距离 标为 8,前序节点为 0

从未标记最优节点(1~8)中,找距离出发点最小的节点 => 1

节点 0 1 2 3 4 5 6 7 8
最优节点
0 出发 0 4 8
前序点 0 0

更新1邻近节点2、7

上一次的最优节点是 1

从0点出发,到 节点 1 相邻的节点 2、7

0->1->2 = 4 + 8 = 12 , 节点 2 此时为 ∞,因此 节点 2 的 距离 标为 12,前序节点为 1

0->1->7 = 4 + 11 = 15 , 节点 7 已有值 8,8<15,因此 节点7 的 距离、前序节点保持不变

从未标记最优节点(2~8)中,找距离出发点最小的节点 => 7

节点 0 1 2 3 4 5 6 7 8
最优节点
0 出发 0 4 12 8
前序点 0 1 0

更新7邻近节点 8、6

上一次的最优节点是 7

从0点出发,到 节点 7 相邻的节点 8、6

0->7->8 = 8 + 7 = 15 , 节点 8 此时为 ∞,因此 节点 8 的 距离 标为 15,前序节点为 7

0->7->6 = 8 + 1 = 9 , 节点 6 此时为 ∞,因此 节点 6 的 距离 标为 9,前序节点为 7

从未标记最优节点(2~6、8)中,找距离出发点最小的节点 => 6

节点 0 1 2 3 4 5 6 7 8
最优节点
0 出发 0 4 12 9 8 15
前序点 0 1 7 0 7

更新6邻近节点 8、5

上一次的最优节点是 6

从0点出发,到 节点 6 相邻的节点 8、5

0->7->6->8 = 8 + 1 + 6 = 15 , 节点 8 已有值 15,15=15,因此 节点 8 的 距离、前序节点保持不变

0->7->6->5 = 8 + 1 + 2 = 11 , 节点 5 此时为 ∞,因此 节点 5 的 距离 标为 11,前序节点为 6

从未标记最优节点(2~5、8)中,找距离出发点最小的节点 => 5

节点 0 1 2 3 4 5 6 7 8
最优节点
0 出发 0 4 12 11 9 8 15
前序点 0 1 6 7 0 7

更新5邻近节点 2、3、4

上一次的最优节点是 5

从0点出发,到 节点 5 相邻的节点 2、3、4

0->7->6->5->2 = 8 + 1 + 2 + 4 = 15 , 节点 2 已有值 12,12<15,因此 节点2 的 距离、前序节点保持不变

0->7->6->5->3 = 8 + 1 + 2 + 14 = 25 , 节点 3 此时为 ∞,因此 节点 3 的 距离 标为 25,前序节点为 5

0->7->6->5->4 = 8 + 1 + 2 + 10 = 21 , 节点 4 此时为 ∞,因此 节点 4 的 距离 标为 21,前序节点为 5

从未标记最优节点(2、3、4、8)中,找距离出发点最小的节点 => 2

节点 0 1 2 3 4 5 6 7 8
最优节点
0 出发 0 4 12 25 21 11 9 8 15
前序点 0 1 5 5 6 7 0 7

更新2邻近节点 3、8

上一次的最优节点是 2

从0点出发,到 节点 2 相邻的节点 3、5、8,节点5已标记,所以不处理节点5

0->1->2->3 = 4 + 8 + 7 = 19 , 节点 3 已有值 25,25>19,因此 节点 3 的 距离 标为 19,前序节点为 2

0->1->2->8 = 4 + 8 + 2 = 14 , 节点 8 已有值 15,15>14,因此 节点 8 的 距离 标为 14,前序节点为 2

从未标记最优节点(3、4、8)中,找距离出发点最小的节点 => 8

节点 0 1 2 3 4 5 6 7 8
最优节点
0 出发 0 4 12 19 21 11 9 8 14
前序点 0 1 2 5 6 7 0 2

更新8邻近节点

上一次的最优节点是 8

8的邻近节点,2、7、6 都已被标记为最优节点,所以不需要处理

从未标记最优节点(3、4)中,找距离出发点最小的节点 => 3

节点 0 1 2 3 4 5 6 7 8
最优节点
0 出发 0 4 12 19 21 11 9 8 14
前序点 0 1 2 5 6 7 0 2

更新3邻近节点

上一次的最优节点是 3

最优节点3的邻近节点:2、5、4中 2、5都已被标记为最优节点,处理 4

0->1->2->3->4 = 19 + 9 = 28 , 节点 4 已有值 21,21<28,因此 节点 4 的 距离 、前序节点保持不变

从未标记最优节点(4)中,找距离出发点最小的节点 => 4

节点 0 1 2 3 4 5 6 7 8
最优节点
0 出发 0 4 12 19 21 11 9 8 14
前序点 0 1 2 5 6 7 0 2

已时已全部结束

最短距离

从出发点0 到节点 4 的最短距离 = 21

最短路径

反向追溯

4 的前序节点 5,5的前面是 6 ... => 4 -> 5 -> 6 -> 7 -> 0

因此 0 -> 7 -> 6 -> 5 -> 4 是最短路径

https://www.bilibili.com/video/BV1zz4y1m7Nq

路径规划算法 - 求解最短路径 - Dijkstra(迪杰斯特拉)算法的更多相关文章

  1. c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法

    c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法 图的最短路径的概念: 一位旅客要从城市A到城市B,他希望选择一条途中中转次数最少的路线.假设途中每一站都需要换车,则这个问题反映到图上就是 ...

  2. 图解Dijkstra(迪杰斯特拉)算法+代码实现

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

  3. (Dijkstra)迪杰斯特拉算法-最短路径算法

    迪杰斯特拉算法是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 算法思想:设G=(V,E)是一个带权有向图 ...

  4. 最短路径之迪杰斯特拉算法的Java实现

    Dijkstra算法是最短路径算法中为人熟知的一种,是单起点全路径算法.该算法被称为是“贪心算法”的成功典范.本文接下来将尝试以最通俗的语言来介绍这个伟大的算法,并赋予java实现代码. 一.知识准备 ...

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

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

  6. 最短路径之迪杰斯特拉算法(Java)

    1)Dijkstra算法适用于求图中两节点之间最短路径 2)Dijkstra算法设计比较巧妙的是:在求源节点到终结点自底向上的过程中,源节点到某一节点之间最短路径的确定上(这也是我之前苦于没有解决的地 ...

  7. Dijkstra(迪杰斯特拉)算法求解最短路径

    过程 首先需要记录每个点到原点的距离,这个距离会在每一轮遍历的过程中刷新.每一个节点到原点的最短路径是其上一个节点(前驱节点)到原点的最短路径加上前驱节点到该节点的距离.以这个原则,经过N轮计算就能得 ...

  8. 最短路径算法—Dijkstra(迪杰斯特拉)算法分析与实现(C/C++)

    Dijkstra算法 ———————————最后更新时间:2011.9.25———————————Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径. ...

  9. 图->最短路径->单源最短路径(迪杰斯特拉算法Dijkstra)

    文字描述 引言:如下图一个交通系统,从A城到B城,有些旅客可能关心途中中转次数最少的路线,有些旅客更关心的是节省交通费用,而对于司机,里程和速度则是更感兴趣的信息.上面这些问题,都可以转化为求图中,两 ...

  10. 图(最短路径算法————迪杰斯特拉算法和弗洛伊德算法).RP

    文转:http://blog.csdn.net/zxq2574043697/article/details/9451887 一: 最短路径算法 1. 迪杰斯特拉算法 2. 弗洛伊德算法 二: 1. 迪 ...

随机推荐

  1. HDU 3829 Cat VS Dog 猫和狗(二分图)结题报告

    听学长说这道题很ex,但是思路想到的话还是挺简单的. 可能是受上一道题(放置机器人)的启发,也是找互相冲突的点连线. 但是并不是完全一样(废话)放置机器人那道题是找到冲突点连线后直接求最大匹配即可. ...

  2. java与es8实战之四:SpringBoot应用中操作es8(无安全检查)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本篇是<java与es8实战>系 ...

  3. 深入理解Linux内核——内存管理(3)

    提要:本系列文章主要参考MIT 6.828课程以及两本书籍<深入理解Linux内核> <深入Linux内核架构>对Linux内核内容进行总结. 内存管理的实现覆盖了多个领域: ...

  4. ArcMap中矢量数据修改标注Label的方法

      本文介绍在ArcMap软件中,修改图层标签(Label)所显示字段与具体显示内容的方法.   在之前的文章中,我们看到了ArcMap中修改图层标签的重要性:可是,如何自定义图层的标签内容呢?    ...

  5. QA|Pycharm:allure : 无法将“allure”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。|Allure

    Pycharm中生成allure测试报告时报错如图: 单独执行allure --version也不行,cmd这样执行也报同样的错 网上查了 说是环境变量问题,加一下cmd可以了,重启pycharm也可 ...

  6. MySQL中不同场景中排它锁的不同表现

    mysql5.7 Golang的gorm做的测试 最后结论如下: 按主键查询,只会锁查到的那条数据 按主键加其他字段查询同上, 按照非主键字段查询,查到查不到都会造成表锁 (以上的锁指排他锁) 排它锁 ...

  7. doris建表报错 errCode = 2, detailMessage = Scale of decimal must between 0 and 9. Scale was set to: 10

    doris建表报错 问题背景 当我从Mpp库向doris库中导数据时,需要先创建对应的数据表,将Mpp库中表的建表语句略作修改后,在doris服务器上运行 CREATE TABLE opt_conne ...

  8. Solution Set -「NOI Online R1」

    NOI-Online-T1-序列 其实这道题是全场最难的-- 我这里给出一种并查集的做法. 首先我们把操作2中的 \(u\) 和 \(v\) 合并 对于操作1我们可以把他转化为操作2来做. 比如我们针 ...

  9. 【matplotlib基础】--结合地图

    如果分析的数据与地域相关,那么,把分析结果结合地图一起展示的话,会让可视化的效果得到极大的提升. 比如,分析各省GDP数据,人口数据,用柱状图,饼图之类的虽然都可以展示分析结果,不过,如果能在全国的地 ...

  10. 用 Dijkstra 算法解决最短路问题

    话不多说,先看图 1.1 朴素版的Dijkstra算法 一般用到这个情况稠密图,也就是节点的个数比边的个数少. (稠密图用邻接矩阵存储) #include<cstring> #includ ...