首页 > 编程语言 >[笔记]Dijkstra算法正确性证明

[笔记]Dijkstra算法正确性证明

时间:2024-11-15 21:21:40浏览次数:1  
标签:短路 算法 正确性 Dijkstra 负权 rightarrow

最近做了一些题,感觉对算法更深刻的理解是比套板子更深层次的,在这个层次上解决问题,思路会更加清晰。比如P5687 [CSP-S2019 江西] 网格图题解)这道题就是网格图的最小生成树,解法就建立在普通Kruskal的基础上,当时想了挺久也没想出来,看了题解才豁然开朗。所以各算法总是要回顾回顾的~

除了做题,没事想一想算法的工作原理,也会对算法有更深的理解。以后我会多写一些对一些算法的剖析和理解(可能并不是特别严谨,主要以可读性为主,以供随时回顾)。


Dijkstra的算法全过程

  • 初始定义\(S=\varnothing,T=V\)。
  • 重复下列操作,直到\(T=\varnothing\):
    • 从\(T\)中找到到\(S\)距离最近的节点\(u\),此时\(u\)的最短路确定。
    • 将\(u\)从\(T\)中取出,转入\(S\),并对\(u\)的邻接节点进行松弛操作。

Dijkstra正确性证明

对于节点\(u\),我们要证明它加入\(S\)时,我们确定下来的最短路是实际的最短路。

反证,假设在操作\(1\)结束后,有\(x\in T\),使得存在\(T\rightarrow\dots\rightarrow x\rightarrow u\),使得\(dis[x]+v<dis[u]\),由于边权\(v\)非负,所以一定有\(dis[x]<dis[u]\),那么\(x\)一定提前于\(u\)进入\(T\)并对\(u\)进行松弛了,与\(x\notin T\)矛盾。

同时这也解释了Dijkstra为什么不能处理负权边:如果存在负权边,我们就不能推出\(dis[x]<dis[u]\)。

以前有段时间疑惑过为什么不能让所有边都加某个值来去除负权边,然而这样很显然是错误的:

标签:短路,算法,正确性,Dijkstra,负权,rightarrow
From: https://www.cnblogs.com/Sinktank/p/18548565

相关文章

  • 1018 Public Bike Management(多条最短路径,dijkstra+dfs+回溯)
     该题考查多条最短路径的计算,对比单条最短路,主要有两点不同:1.在dijkstra算法中记录每个结点的所有相同最短距离的前结点2.在dfs找多条最短路径时需要回溯状态拿到所有最短路径以后,我们根据题意去获取相应的结果即可1#include<bits/stdc++.h>2usingnamespacestd;......
  • 有理逼近AAA算法
    用于有理逼近的AAA算法TheAAAAlgorithmforRationalApproximation,YujiNakatsukasa,OlivierSète,andLloydN.Trefethen,SIAMJournalonScientificComputing201840:3,A1494-A1522,https://doi.org/10.1137/16M1106122一、算法用途AAA算法是有理逼近算法,同......
  • 代码随想录算法训练营day47| 739. 每日温度 496.下一个更大元素 I 503.下一个
    学习资料:https://programmercarl.com/0739.每日温度.html#算法公开课单调栈:用数组模拟单调栈,今天的题中,栈中元素都保存的索引值基本思路:将新元素和栈顶索引对应值比较,如果要保持单调递增,则需要新元素不大于栈顶索引对应值;若满足就加入新元素索引到栈中;若不满足,就根据具体题意看......
  • 算法 -交换排序
    博客主页:【夜泉_ly】本文专栏:【算法】欢迎点赞......
  • 多种智能优化算法优化正则化极限机器学习机(RELM)的数据回归预测
     正则化极限学习机(RELM)通过引入正则化项来约束模型复杂度,从而提高模型的泛化能力。然而,优化RELM的最优权值(即隐藏层到输出层的权重)仍然是提升其性能的关键。通过多种智能优化算法来优化RELM的最优权值,可以显著提升其在数据回归预测任务中的性能。以下是相关过程的基本原理和示......
  • 比赛讲解:图论算法(11.11~11.15)
    图论算法T1-U502532找水杯一道水题,基本上和P4779一样(我连样例都搬过来了,能不一样吗?)所以呢,你们可以直接用\(Dijikstra\)1.最初起点到达所有点的距离都是未知的,记作无穷大。2.在对起点的邻接点进行扫描后发现,起点可以通过某些边抵达一些节点,那么就更新d数组(d[i]用于记录起点s......
  • 【深度学习目标检测|YOLO算法5-2-3】YOLO家族进化史:从YOLOv1到YOLOv11的架构创新、性
    【深度学习目标检测|YOLO算法5-2-3】YOLO家族进化史:从YOLOv1到YOLOv11的架构创新、性能优化与行业应用全解析…【深度学习目标检测|YOLO算法5-2-3】YOLO家族进化史:从YOLOv1到YOLOv11的架构创新、性能优化与行业应用全解析…文章目录【深度学习目标检测|YOLO算法5-2-3......
  • 航电系统传感器技术算法概览!
    一、核心技术传感器集成与融合技术航电系统通常需要集成多种传感器,如摄像头、激光雷达、毫米波雷达、惯性导航单元(INU)和全球定位系统(GPS)等。这些传感器各自具有不同的优势和局限性,因此需要通过集成与融合技术将它们的数据进行有效整合,以提高系统的整体感知能力。传感器融合......
  • 抽奖-随机加权算法
    packagelotteryimport( "fmt" "math/rand" "sort" "time")typeLotterystruct{}funcNewLottery()*Lottery{ return&Lottery{}}typePrizestruct{ Namestring Stockint Weightint//权重}//......
  • 并行排序算法:双调排序
    引入有一个排列,你可以通过“比较并交换”这个操作将该排列排好序,即,每次选择一对数\((i,j)\),若\(a_i>a_j\)则交换,否则不交换。但是,你可以把多对\((i,j)\)放在一次操作里并行“比较并交换”,此时操作数记1,与数对的对数无关,但是每个\(i\)只能出现至多一次。要求操作数最小。......