最短路径问题:Dijkstra算法原理和证明

图论:Dijkstra算法——最详细的分析,图文并茂,一次看懂! Dijstra算法 阅读详情

一、问题

最短路径问题:从一个有向图(或无向图)的某个顶点s出发,求到达其他任意一个顶点所经过的边的权重之和最小的路径。权重之和称为两个顶点之间的距离(距离均为正数)。
我们以无向图为例(顶点之间没有方向),每条边的权重可以使用权重矩阵W来描述,如有n个顶点,则权重矩阵大小为 n*n,W(i,j)为顶点i和j的直接相连的边的权重,如果没有直接相连,则赋值为无穷大。权重矩阵为对称矩阵。

二、算法

1、算法介绍
     Dijkstra算法与深度优先搜索类似,使用了贪心的思想,从一个顶点出发,每次查询所关联到的顶点的最短路径。
2、算法步骤
(1)定义变量:
定义一个数组dist,dist[m]表示顶点s到顶点m的最短距离。(在迭代过程中,里面的值可能不是最终最短距离,但是是当前考虑到已经扫描到的边的最短距离)
定义一个集合T,里面存放着已经查询到最终最短路径的顶点集合。
(2)初始化:
任取顶点 i,如果 s 和 i 直接相连,则dist[i]=W(s,i),否则 W(s, i) 为无穷大。
T 集合只包含顶点 s。
(3)迭代:
A、从dist中找到最小值(除去集合 T 中包含的点),记为 dist[r]=d,然后将顶点 r 划入到集合 T 中。
B、对于每一个不属于集合 T 的点,比如顶点 q, 查看新加入的顶点 r 是否可以直接到达顶点 q,如果是,则比较通过顶点 r 到达顶点 q 的路径长度和当前的dist[q]值,然后取较小值,即 dist[q] := min(dist[r]+W(r, q), dist[q])
C、跳回到步骤A,直到所有的点都进入到了集合 T。
D、dist 中存放的值即为每个点的最终最短路径。

三、演示


有4个点,A 为起点,要求从 A 分别到 B、C、D的最短路径。
1、初始化变量:
dist = [9, 4, ∞],分别表示从源点到 B、C、D点的最短路径。
T = {A}
2、迭代:
(1)从dist不属于T的值中{9,4,∞}选一个最小值为4,对应点C,因此 T = {A,C}。
所有不属于集合T的点包括B、D。新加入的 C 可以直接到达 B,则 dist[B] := min(4+3,9)=7 ;新加入的 C 可以直接到达 D,则 dist[D] := min(4+1,∞)=5。因此 dist=[7,4,5]
(2)从dist不属于T的值中{9,5}选一个最小值为5,对应点D,因此 T = {A,C,D}
所有不属于集合T的点包括B。新加入的 D 可以直接到达 B,则 dist[B] := min(5+1,7)=6。因此 dist=[6,4,5]
(3)不属于T的只剩下B了, 直接加入到T即可。
(4)根据dist的值,从A点到B、C、D点的最短路径分别为:6、4、5

四、证明

推论1、如果只考虑集合 T 中包含的点,那么步骤A中 d 就是顶点 s 到 顶点 r 的最短距离(只考虑集合 T 的范围内的路径)。
证明:递归法证明:
(1)在第一次迭代中,dist初始化为直接与 s 相连的边的权重,明显最小权重的边连接的那个点为 s 到此点的最短距离。
(2)假如已经迭代完第 i 次,T 中包含了 i 个顶点(除了顶点s),dist 中包含了 i 个最终最短距离(还有其他不是无穷大的数值,但是不一定是最终最短距离),那么第 i+1 次的步骤A需要从 dist 中挑出除去这 i 个最短距离外的最小值,比如 dist[r]=d。因为前 i 次每次迭代中步骤B如果扫描到了与点 r 直接相连的点,都会比较一下经过此点到 r 的路径总长与当前已经存放的dist[r]的大小,即:

其中公式右边min内的 dist[r] 为 s 到 r 的直接距离,dist[u] 为集合 T 内 s 到 u 的最终最短距离。此公式恰好是在集合 T 的范围内计算从 s 到 r 的最短距离的方法,因此得证。

推论2、如果 r 点属于集合 T,且存在一个点 t,s.t. 从 s 到 t 的某条路径总长e < dist[r],则 t 点一定也属于集合 T。
证明:不是一般性,我们把从 s 点分别到 t 点和 m 点的路径画出来:

且 s →...→ a → b1 →...→ bn → t 的总长为 e, s →...→ a → c1 →...→ cm → r 的总长为 dist[r]。
我们定义 distance(bi) 为 s →...→ a → b1 →...→ bi 的路径总长,distance(cj) 为 s →...→ a → c1 →...→ cj 的路径总长。
(1)当 e 为 s 到 t 的最短距离时:当集合 T 包含 t 时,一定也包含了 s...a、b1~bn。
因为 r 属于 T,则一定存在某次迭代,s.t.  s 和 a 均包含于集合 T。继续迭代,每次可能会从 b 系列中选取点归入集合 T,可能会从 c 系列中选取点归入集合 T,也可能是其他点。由于 distance(t) = e < dist[r] = distance(r),则一定存在点 ci,1≤i≤m,s.t. distance(ci) ≤ distance(t) 且 distance(c(i+1)) > distance(t)。(记 c(m+1)为r)。因此集合 T 中加入点的次序为 {ci, t} 早于 {c(i+1), r}。因此如果 r 属于集合 T,则 t 一定也属于集合 T,且比 r 先划入到集合 T。
(2)当 s 到 t 的最短距离 < e 时:s 到 t 的最短距离为 g,则 g < e,因此有 g < dist[r]。将 a、b1~bn 变为最短路径上的点,则变为了第(1)种情况。

推论3、步骤A中 d 就是顶点 s 到 顶点 r 的最终最短距离:
证明:假设 d 不是 s 到 r 的最终最短距离,根据推论1可知,s 到 r 的真正最终最短路径一定包含了集合 T 之外的点(记为 t),即 s →...→ t → ...→ r 的总长 < d。因为权重总是为正数,因此 s → ...→ t 的总长 < d,根据推论2可知, t 一定属于 T ,这与 t 不属于集合 T 矛盾。因此 d 是 s 到 r 的最终最短距离。

欢迎关注我的公众号:


Dijkstra算法图文详解 Dijkstra算法算是贪心思想实现的,首先把起点到所有点的距离存下来找个最短的,然后松弛一次再找出最短的,所谓的松弛操作就是,遍历一遍看通过刚刚找到的距离最短的点作为中转站会不会更近,如果更近了就更新距离,这样把所有的点找遍之后就存下了起点到其他所有点的最短距离。 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径。它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。 这样一个有权图,Dijkstra算法可以计算任意节点到其他节点的最短 阅读详情

相关推荐

java实现迪杰斯特拉(Dijkstra)算法求解最短路问题

迪杰斯特拉(Dijkstra)算法是由荷兰计算机科学家狄克斯特拉于1959年提出的。是寻找从一个顶点到其余各顶点的最短路径算法,可用来解决最短路径问题。 迪杰斯特拉算法采用贪心算法的策略,将所有顶点分为已标记点和未标记点两个集合,从起始点开始,不断在未标记点中寻找距离起始点路径最短的顶点,并将其标记,直到所有顶点都被标记为止。需要注意的一点是该方法不能处理带有负权边的图,下面我们举出一个实例并通过迪杰斯特拉方法对其进行求解。 ...

Xing_LG的博客 4万+

狄克斯特拉(Dijkstra)算法详解

最近在看《算法图解》,其中第七章狄克斯特拉算法个人感觉并没有讲的清楚,比如看完7.1节给人的感觉是狄克斯特拉算法会遍历图中的每一条边,后续狄克斯特拉不适用负权边的说法就站不住脚了。后续在查阅诸多资料之后,总结文章一篇,尽可能以通俗易懂且思路清晰的方式来讲解狄克斯特拉算法。...

Wopelo的博客 4万+

双端队列01BFS——从原理到实战:解锁边权0/1图的最优路径

本文深入解析双端队列01BFS算法,专为解决边权0/1图的最短路径问题而设计。通过对比Dijkstra算法,01BFS利用双端队列的O(1)操作将时间复杂度降至O(m),显著提升性能。文章涵盖算法原理、正确性证明、实战案例(如迷宫探索、电路维修)及常见陷阱,帮助开发者高效解决特定场景下的路径优化问题。

weixin_33725807的博客 396

第十六章 Dijkstra算法的讲解以及证明(与众不同的通俗证明)

证明dijkstra,简单的方式帮助大家理解该算法,同时逐行解析代码,帮你秒懂该算法。

Turing_Sheep的博客 4521

Dijkstra算法证明图解

目录前言:算法步骤参数说明算法描述算法过程图解算法可行性证明一.数学归纳法:假设前提:归纳证明:二.贪吃蛇法(个人理解): 前言: Dijkstra算法算是比较经典的一个求单源最短路径的一个算法了,有向图和无向图都可以使用,对于采用邻接表还是邻接矩阵存储图也没有要求。 我在一开始学习这个算法的时候,虽然知道算法的具体处理流程,但是对于算法的原理却是一知半解,在做PTA一些算法题的时候遇到了稍微灵活的题目就歇菜了。所以翻看了一写文档,自己归纳整理了一下原理,也有一些自己的想法,如有不当之处,还望批评指正。 算

一只懒猫的博客 3556

Dijkstra和Prim算法 【含数学证明】

#ACM&算法 不知是不是因为自己的抽象学习能力还是不够强,之前在翻阅别人博客学习这两个算法的时候,整个人一直处于懵逼状态。 分析了一下,发现之前存在的博客教程,大多趋向于方法讲解,学完以后有知其然不知其所以然的感觉。另一部分博客则偏向数学证明,语言严谨但理解起来确实要费一番功夫。所以打算尝试一下在下文里以解决一个问题的方式讲解这两个算法。 在敲算法之前先阐明一下这两个算法所

算法本子 8287

【Java高阶数据结构】图的最短路径问题

这篇文章主要讲的是图的最短路径问题Dijkstra和堆优化版本,Bellman-Ford和队列优化SPFA算法以及Floyd-Warshell算法,在网上的很多资料,他们并没有,都不能打动我,我也心里痒痒的。在我的研究之下,我搞懂了!我尽量的将它描述出来,结合图片和动图以及一些生动的语言去讲懂他!这也是我制作和思考周期最长的一篇文章!

Carefree_State的博客 2203

架构——异地多活成熟的架构模式

摘要: 本文系统介绍了三种异地多活架构模式:业务定制型、业务通用型和存储通用型。业务定制型针对核心业务定制化设计,复杂度低但扩展性差;业务通用型通过统一配套服务(流量调度、配置中心等)实现多业务兼容,适合业务量大但一致性要求不高的场景;存储通用型依托分布式一致性数据库(如OceanBase、TiDB)天然支持强一致性,适合金融等高要求场景,但对部署距离和成本有较高限制。文章对比了各模式的优缺点及适用场景,为不同业务需求下的架构选型提供了实践指导。

小志的博客 7085

别再死记硬背了!用Python手把手带你复现贪心算法的5个经典场景(附代码)

本文通过Python实战演示了贪心算法在5个经典场景中的应用,包括活动选择、零钱兑换、Huffman编码、Dijkstra最短路径和分数背包问题。文章详细拆解了每种场景的代码实现与贪心策略证明,帮助读者深入理解贪婪算法(Greedy Algorithms)的核心思想与适用条件,提升算法实践能力。

weixin_30530939的博客 159

SAP ABAP ALV表格实战:5分钟搞定单元格下拉框配置(附完整代码)

本文详细介绍了在SAP ABAP开发中如何快速配置ALV表格的单元格下拉框功能,通过5分钟实战教程帮助开发者掌握关键步骤。文章包含完整的ABAP代码示例,涵盖下拉值定义、字段目录配置及ALV控件绑定等核心操作,特别适合需要实现财务系统费用类型选择或采购系统物料分类等场景的开发者参考。

weixin_28331555的博客 109

手把手教你用微信小程序实现智能硬件音视频通话(含Linux/RTOS适配)

本文详细介绍了如何利用微信小程序硬件框架(WMPF)和音视频SDK,在智能硬件(包括Linux与RTOS设备)上实现音视频通话功能。文章从架构设计、设备端SDK集成、小程序VOIP插件开发到跨平台调试与性能优化,提供了全链路实战指南,帮助开发者打通微信小程序与嵌入式设备间的实时音视频通信。

ooo22的博客 329

Dijkstra算法原理及证明

算法说明   DijkstraDijkstraDijkstra算法是用于求单源最短路径的算法,即只有一个起始点,求其余每个结点到源点的最小距离。   对于nnn阶网N=(V,E)N=(V,E)N=(V,E),DijkstraDijkstraDijkstra算法按照最短路径长度依次递增的次序求任意给定的某顶点(作为始点)到其它的n−1n-1n−1个顶点的最短路径。若需要求出全部顶点对之间的最短路径,...

qq_42712351的博客 2375

超详细 Git创建仓库及上传项目至Github操作(Windows系统)

文章目录前言一、Git下载及安装二、创建代码仓库1.配置身份2.创建本地仓库3.提交本地代码三、使用Git上传代码至Github1.创建ssh keys2.在Github中新建仓库3.关联本地仓库与Github仓库4.推送代码至Github仓库总结 前言 本文对于Windows系统上git的安装及基本使用方法进行简单介绍,并介绍如何使用git将仓库中的项目上传至个人的Github中去。内容参考《第一行代码》以及一些博客。 本文适合新手阅读哦~ 一、Git下载及安装 打开网站 git下载 下载安装包(直接

lijianyi0219的博客 2万+

最短路径——Dijkstra算法和Floyd算法

一、Dijkstra算法 1、单源点的最短路径问题:给定带权有向图G和源点v,求从v到G中其余各顶点的最短路径。 我们用一个例子来具体说明迪杰斯特拉算法的流程。 定义源点为 0,dist[i]为源点 0 到顶点 i 的最短路径。其过程描述如下: 步骤 dist[1] dist[2] dist[3] dist[4] 已找到的集合 第 1 步 8 ...

凌晨的咸鱼的博客 4万+

购物车智能检测系统:YOLO26 + PyQt5 毕设实现

YOLO26 + PyQt5 完成购物车商品检测系统:标注数据集(OpenImages 筛选 + 自制 500 张),训练 100 epoch 得到 mAP50 约 0.89,集成商品定价后输出总价。建议先用 OpenImages 预训练权重在自制数据上调优(冻住 backbone 前 50 epoch),等 loss 稳定后再解冻全量训练。

m0_64661770的博客 55

Modbus RTU/TCP协议栈手写实现:主从站设计、功能码、CRC、异常响应

本文从协议栈架构、帧结构、功能码、CRC校验、异常响应、主从站设计等多个维度,完整阐述了Modbus RTU/TCP协议栈的手写实现方案。帧间隔机制是RTU的核心,T3.5超时检测决定了帧边界识别CRC16查表法以512字节ROM换取8倍性能提升,适合嵌入式功能码路由表实现可扩展的代码架构,便于新增功能异常响应机制保障协议健壮性,每个错误都有明确反馈Modbus TCP在RTU基础上增加MBAP头,实现以太网扩展多核RTOS环境下的并发访问与线程安全RS-485总线的电气隔离与浪涌保护。

从事移动开发八年,csdn博客专家,阿里云特邀专家,华为云云享专家,高级网络信息安全工程师,大数据工程师(高级),python技术开发(高级),HarmonyOS 应用开发者高级认证,现在某学校任教。 1万+

迪杰斯特拉(Dijkstra)算法描述及其正确性证明

Dijkstra算法描述及其正确性证明

softee的专栏 2万+

华为OD机试双机位C卷-简单的解压缩算法(C/C++/Py/Java/Js/Go)

华为OD机试(机考)双机位C卷 【简单的解压缩算法】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD真题【简单的解压缩算法】。

qq_45776114的博客 474

Dijkstra算法及证明

Dijkstra算法及证明 问题描述 有n个点,m条边,求长度为n的数组dis,其中dis[i]表示从源点s到点i的最短距离 复杂度 O(mlogn)O(mlogn)O(mlogn) 算法步骤 令dis[s] = 0,其余节点的dis为无穷大,并将节点s入队 找出一个未被标记的,dis[x]最小的节点x,然后标记节点x 遍历x的所有相邻边(x,y,z),若dis[y] > dis[x] +...

xing_mo的博客 1249

【QNX Hypervisor 2.2 用户手册】2.6 处理qvm终止

你可以注册通知,以在qvm进程实例退出时得到通知。这样你就可以采取相应的措施来响应这种终止事件。

从0到1,突破自己 1106

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【算法】Dijkstra算法求最短路径

最近一直在刷题,遇到图的问题就感觉无力回天,所以我就总结一下,我对Dijkstra算法的理解 Dijkstra 的整体思路 Dijkstra 的整体思路比较清晰 即进行n(n为n的个数)次迭代去确定每个点到起点的最小值 最后输出的终点的即为我们要找的最短路的距离 所以按照这个思路除了存储图外我们还需要存储两个量 dist[n] //用于存储每个点到起点的最短距离 st[n] //用于在更新最短距离时 判断当前的点的最短距离是否确定 是否需要更新 每次迭代的过程中我们都先找到当前未确定的最短距离的点中距

进阶之路 3501

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

图算法:最短路径算法之dijkstra

文章目录图论单源点最短路径问题Single-source shortest paths1.限制2.思想:贪心3.算法 图论 图G=(V, E)。顶点(就是结点)V,边E,权值w。 路径p:v1→v2→...→vkv_1 \to v_2 \to ... \to v_kv1​→v2​→...→vk​,其w(p)=_i=1...k−1w(vi,vi+1)w(p)=\_{i=1...k-1}w(vi,...

sandalphon4869的博客 1362

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

最短路径:Dijkstra算法和Floyd算法

一、Dijkstra算法(单个顶点到其他顶点的最短距离) 定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。注意该算法要求图中不存在负权边。 问题描述:在无向图 G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到由顶点 V0 到其余各点的最短路径。(单

cristianoxm的博客 1295

数据结构复习指导之图的最短路径(Dijkstra算法和Floyd算法)

本节是历年考查的重点。图的应用主要包括:最小生成(代价)树、最短路径、拓扑排序和关键路径。一般而言,这部分内容直接以算法设计题形式考查的可能性极小,而更多的是结合图的实例来考查算法的具体操作过程,读者必须学会手工模拟给定图的各个算法的执行过程。此外,还需掌握对给定模型建立相应的图去解决问题的方法。

心碎烤肠的博客 1313

详解Dijkstra算法(含数学证明和优化)

Dijkstra算法简介:Dijkstra算法是由荷兰计算机科学家Edsger Wybe Dijkstra于1959年提出的一种解决有向加权图中单源最短路问题的算法,其中要求加权图中不可有负权边。 Dijkstra算法步骤演示 算法数学证明 Dijkstra算法优化

代码火葬场 2万+

Dijkstra算法证明

接上文 Dijkstra最短路径搜索算法非常著名,该算法适用于权重非负的加权有向图中最短路径搜索. Dijkstra最短路径搜索算法: 使用distTo[]索引数组记录搜索起点到节点i的路径长度.若当前最短路径搜索起点为s, 初始化distTo[s]为0, 其余元素为正无穷大. 每次选择distTo[]元素最小且尚未被松弛的节点进行邻边松弛, 当所有节点松弛完毕后, 所有从s可达的节点v的最短路...

zhangxiaojiakele的博客 481
上一篇: 公众号中点击第三方网页时如何顺带openId
下一篇: 最短路径问题:Dijkstra算法的python实现
HappyRocking
博客等级 码龄12年 222粉丝 176原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值