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. LeetCode 周赛上分之旅 #42 当 LeetCode 考树上倍增,出题的趋势在变化吗

    ️ 本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 BaguTree Pro 知识星球提问. 学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越 ...

  2. 关于ChatGPT的一些闲扯淡(1)

    这篇写的有点迟了,前者子ChatGPT正火的时候,懒病发作一直拖延.今天对ChatGPT做一个简单的讨论,也是把学习的心得和大家分享一下. 首先什么是GPT,英文全称是Generative Pretr ...

  3. DevOps |研发效能之环境、程序、配置、SQL变更管理

    本文主要是讲如何建立有效的环境.程序.配置.SQL变更和管理平台. ​几天前和一个朋友聊到环境.程序的配置变更,SQL变更和整个上线流程.之前我们在这块也做了很多,有做的好的也有做的一般的,借机都总结 ...

  4. Hadoop核心概念

    大数据开发总体架构: Hadoop是大数据开发所使用的一个核心框架.使用Hadoop可以方便的管理分布式集群,将海量数据分布式的存储在集群中,并使用分布式并行程序来处理这些数据. Hadoop由许多子 ...

  5. ipmitool配置机器的BMC

    一.设置IP地址 1.确定操作对象 #ipmitool mc info 输出中"Device Revision"是命令的操作对象 2.设置BMC IP # ipmitool -I ...

  6. sublime运行php文件

    sublime 运行 php 文件 使用 sublime 打开一个php文件 然后 Tools -> Build System -> New Build System 将以上打开的文件内容 ...

  7. 文心一言 VS 讯飞星火 VS chatgpt (90)-- 算法导论8.3 3题

    三.用go语言,利用归纳法来证明基数排序是正确的.在你所给出的证明中,在哪里需要假设所用的底层排序算法是稳定的? 文心一言: 基数排序是一种非比较型整数排序算法,其通过在每一位上进行比较来排序.基数排 ...

  8. MindSpore简要性能分析

    技术背景 在之前的一篇博客中,我们介绍过MindInsight的安装与使用.不过在前面的文章中,我们主要介绍的是MindInsight与SummaryCollector的配合使用,更多的是用于对结果进 ...

  9. Flask框架——flask介绍

    文章目录 1 什么是flask? 2 为什么要有flask? 3 学前准备:虚拟环境 3.1 虚拟环境是什么? 3.2 如何使用虚拟环境? 3.2.1 搭建虚拟环境 3.2.1 在虚拟环境中安装我们的 ...

  10. Vocabulary

    词汇(Vocabulary) blackmail ( n.) :the obtaining of money or advancement by threatening to make known u ...