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. CTFshow misc1-10

    小提示:需要从图片上提取flag文字,可以通过截图翻译或者微信发送图片,这两个的ai图像识别挺好用的. misc1: 解压打开就能看见flag,提取出来就行 misc2: 记事本打开,看见 ng字符, ...

  2. 弹性数据库连接池探活策略调研(一)——HikariCP

    调研背景: 数据库连接建立是比较昂贵的操作(至少对于 OLTP),不仅要建立 TCP 连接外还需要进行连接鉴权操作,所以客户端通常会把数据库连接保存到连接池中进行复用.连接池维护到弹性数据库(JED) ...

  3. 万字+20张图剖析Spring启动时核心的12个步骤

    大家好,我是三友~~ 今天来扒一扒Spring在启动过程中核心的12个步骤 之所以来写这篇文章,主要是来填坑的 之前在三万字盘点Spring 9大核心基础功能这篇文章的末尾中给自己挖了一个坑,提了一嘴 ...

  4. 面试官:说一下 MyBatis 缓存机制?

    MyBatis 的缓存机制属于本地缓存,适用于单机系统,它的作用是减少数据库的查询次数,提高系统性能. MyBaits 中包含两级本地缓存: 一级缓存:SqlSession 级别的,是 MyBatis ...

  5. 一次性全讲透GaussDB(DWS)锁的问题

    本文分享自华为云社区<GaussDB(DWS)锁问题全解>,作者: yd_211043076. 一.gaussdb有哪些锁 1.常规锁:常规锁主要用于业务访问数据库对象的加锁,保护并发操作 ...

  6. .NET周刊【9月第2期 2023-09-10】

    国内文章 使用 OpenTelemetry 构建 .NET 应用可观测性(2):OpenTelemetry 项目简介 https://www.cnblogs.com/eventhorizon/p/17 ...

  7. C++的动态分派在HotSpot VM中的重要应用

    众所周知,多态是面向对象编程语言的重要特性,它允许基类的指针或引用指向派生类的对象,而在具体访问时实现方法的动态绑定.C++ 和 Java 作为当前最为流行的两种面向对象编程语言,其内部对于多态的支持 ...

  8. 使用 gopkg.in/yaml.v3 解析 YAML 数据

    YAML(YAML Ain't Markup Language)是一种人类可读的数据序列化格式,常用于配置文件和数据交换.在 Go 语言中,你可以使用 gopkg.in/yaml.v3 包来解析和生成 ...

  9. Vue框架快速上手

    Vue基础 vue指令 内容绑定 v-text 设置标签的内容一般通过双大括号的表达式{{ }}去替换内容 {{ hello }} v-html 与v-text类似区别在于html中的结构会被解析为标 ...

  10. 教育法学期末考试02MOOC

    期末考试 返回 期末考试试卷为客观题,总分为100分,占课程成绩的40%.其中包含16道单选题,2道多选题.共18道题.单选题每道5分,多选题每道10分,限时90分钟完成.  倒计时:  01:21: ...