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. N1nEmAn-2023集训wp

    week1 2022-12-28 WP 0x00 T1 reverse3 前几天没注意到要发wp,现在补一下.最近在学汇编,pwn题没做新的了.想到之前了解到hws的pwn会考花指令,听hjx他们说那 ...

  2. JAVA-Springboot实践项目-用户注册

    Smiling & Weeping ----我本没喜欢的人, 见你的次数多了, 也就有了. 1.创建数据表 1.1.选中数据表: use store 1.2.创建t_user表: 2创建用户实 ...

  3. Solution -「洛谷 P5046」「YunoOI 2019 模拟赛」Yuno loves sqrt technology I

    Description Link. 无修改区间求逆序对. Solution 首先有一个显然的 \(\Theta(N\sqrt{N}\log_{2}N)\) 做法,由于过不了所以我就不废话. 其实有了 ...

  4. 一文教你理解Kafka offset

    日常开发中,相信大家都对 Kafka 有所耳闻,Kafka 作为一个分布式的流处理平台,一般用来存储和传输大量的消息数据.在 Kafka 中有三个重要概念,分别是 topic.partition 和 ...

  5. QFluentWidgets: 基于 C++ Qt 的 Fluent Design 组件库

    简介 QFluentWidgets 是一个基于 Qt 的 Fluent Designer 组件库,内置超过 150 个开箱即用的 Fluent Designer 组件,支持亮暗主题无缝切换和自定义主题 ...

  6. tmai

    天猫精灵技能应用平台合作协议 发布日期:2020年03月18日 更新日期:2021年02月01日 鉴于您(语音技能.小程序或应用程序APP等的制作.提供或开发者)希望入驻或与天猫精灵技能应用平台(又称 ...

  7. Jmeter中使用BeanShell获取接口返回的指定值

    第一步:先引入jar包编写代码的时候,引入了一个jar包,是需要把它添加在测试计划中的  第一种:获取data中的paramName和paramVal值 //获取当前请求响应结果 String res ...

  8. 记一次基于 PowerShell 的 Git 自动化部署 Java 多服务实践

    前言 有这么一个自动化部署的需求,凑巧 git 还直接建立在测试服务器上,部署后可以直接在测试服务器上演示 步骤 建立 Git 仓库 与一般的 Git 部署一样,区别是需要添加 --bare 开关,这 ...

  9. log4j2同步日志引发的性能问题

    1 问题回顾 1.1 问题描述 在项目的性能测试中,相关的接口的随着并发数增加,接口的响应时间变长,接口吞吐不再增长,应用的CPU使用率较高. 1.2 分析思路 谁导致的CPU较高,阻塞接口TPS的增 ...

  10. gson如何序列化子类

    需求 目前有一个需求,不同对象有一些公共属性,分别也有一些不同的属性.对方传过来的json字符串中,把这些对象组成了一个数组返回过来的.这样该如何反序列化呢? 举例 定义Person类.Student ...