首页 > 编程语言 >Dijkstra 算法正确性证明

Dijkstra 算法正确性证明

时间:2024-08-10 17:05:02浏览次数:10  
标签:短路 路径 算法 更新 正确性 Dijkstra 节点 dis

Dijkstra正确性证明

Dijkstra算法的本质

如果你有思考“为什么”的习惯,就一定会发现,Dijkstra 的本质就是动态规划 + BFS 。松弛操作实际上就类似于动态规划中的状态更新。

设 \(f(u)\) 为 \(s\) 至 \(u\) 的最短路径( \(s\) 为源点,下文同)。显然,状态转移方程为:

\[f(u)=min_{v\in fathers} f(v)+w_{u,v} \]

其中,\(fathers\) 表示所有点 \(v\) 使得存在边 \(e=v\to u\) 。\(w_{u,v}\) 则表示该边的权。

这个状态转移方程是显然的,是非常经典的“退一步思考”,即思考点 \(u\) 是父节点中哪个点来的。既然我们求的是最短路,当然是能让整条路径最小的那一点。

而 Dijkstra 中,则引入了一切别的策略,本质上都只是优化。

正文

好了,实际上前文和正文都没关系,只是想要分享一下我对于一个算法的理解。

我们重新回忆算法每一步都干了什么:

  1. 在未确定最短路集合 \(T\) 中,选择估计最短路最短的点,将其移动至已确定最短路集合 \(S\) 中。
  2. 利用此点,更新邻近的点(松弛)。

我们无非就是需要证明,每次从 \(T\) 集合中拿出的点的估计最短路 $ dis(u) $ 与实际最短路 \(D(u)\) 相等。

使用反证法,假设此结论不成立,设 \(e\) 点是第一个从 \(T\) 点中拿出而 \(dis(e)\not= D(e)\) 。我们知道,估计最短路一定大于或等于实际最短路,即 $ dis(e)\ge D(e) $。

整理,得 $ dis(e) \gt D(e) $ 。

首先讨论一下第一个点能否不满足此结论。

算法刚开始,$ T $ 的每个点都为 $ +\infty $ 。随后,$ T_s $ 被修改为 0 。

那么,第一次拿出的点一定是 $ s $ 。$ dis(s)=D(s)=0 $ ,满足结论,即 $ e\not=s $ 。

接下来讨论不存在 $ s\to e$ 的路径时(即 \(D(s)=+\infty\) 时),是否满足结论:

此算法的 $ T_e $ 与 \(dis(e)\) 的更新依赖于父节点的松弛操作。

若父节点也未曾更新,\(T_e\) 与 $ dis(e) $ 也都未更新,$ dis(e)=D(e)=+\infty $ 。

若父节点更新过,意味着父节点的父节点也会有更新。不断追溯,发现,最初的更新来源于源点。

也就是说,若父节点更新,是从源点开始一路更新到父节点。那么意味着父节点存在一条路径 $ s \to father $。

若 $ e $ 点的父节点存在路径,那么 $ e $ 点也一定存在一条路径 $ s \to father \to e $ 。与讨论条件矛盾。

所以,若 \(e\) 点不存在与 $ s $ 点的路径时,结论成立。

也就是说 $ e $ 点一定存在一条路径 $ s\to e $ 。

那么讨论一下该路径的性质。

因为 $ e $ 是第一个出错的点,所以在此之前,所有 $ u \in S $ 都满足 $ dis(u) = D(u) $ 。

若所有 \(s \to e\) 的路径上的所有点都满足 $ u \in S $ ,显然 $ dis(e)=D(e) $ 与假设矛盾。

所以一定有一条路径 \(s \to x \to y \to e\) ,其中,$ y $ 是路径上第一个属于 $ T $ 的点。那么 $ x $ 就一定满足 $ x \in S $ 。

刚才已经提到,$ x $ 一定满足 $ dis(x) = D(x) $ 。此时会更新 $ y $ 。可以证明,当 $ e $ 被取走时,$ dis(y)=D(y) $。

\[dis(y)=D(y) \le D(e) \lt dis(e) \]

但是因为过程 1 的条件,$ e $ 被取走时, $ e $ 一定是估计最短路最小的,而 $ y $ 没有取走,在比较范围内,所以一定有 $ dis(y) \ge dis(e) $ 。

但此与前文不等式链相矛盾,所以假设不成立,命题得证。

本证明大部分都取自 OI Wiki .

标签:短路,路径,算法,更新,正确性,Dijkstra,节点,dis
From: https://www.cnblogs.com/liserver/p/18352518

相关文章

  • 字节大模型算法岗一面,直接跪了。。。
    最近分享了很多大厂的算法岗面试真题,大家要清楚:AIGC相关的面试题猛增,特别是爆火的LLM、多模态、扩散模型等考察的知识点越来越多。这里特别整理了几道字节跳动一面中最新的代表性面试题,下图中的题目,你会几题?!介绍SAM和变体xLSTM有哪些新技术?介绍RLHF和RAGLoRA和QLoR......
  • 图像滤波算法
    3.1平滑滤波器(SmoothingFilters)介绍平滑滤波器用于去除图像中的噪声,使图像更加平滑和柔和。常见的平滑滤波器包括均值滤波和高斯滤波。原理平滑滤波器通过对像素及其邻域像素的值进行平均或加权平均,来减少图像中的噪声。均值滤波采用简单的均值计算,而高斯滤波则使用加......
  • 【数据结构与算法】输出二叉树中从每个叶子结点到根结点的路径 C++实现(二叉树+栈+深度
    二叉树叶子节点到根节点的路径题目描述给定一棵二叉树的后序遍历序列post[s1..t1]和中序遍历序列in[s2..t2],设计一个算法,输出二叉树中从每个叶子节点到根节点的路径。请使用栈的数据结构解决。输入格式输入包括两行:第一行为后序遍历序列post[s1..t1]。第二行为中序......
  • trie算法
    1、定义高效的存储和查找字符串集合的数据结构它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高2、构建我们可以使用数组来模拟实现Trie树。我们设计一个二维数组son[N][26]来模拟整个树的结构,而cnt[N]来记录单词个......
  • 【MATLAB源码】数学建模基础教程(2)--层次分析法(评价类算法)
    系列文章目录在最后面,各位同仁感兴趣可以看看!层次分析法引言一、层次分析法的特点二、模型的建立求解过程(1)问题的提出:实际问题的转化(2)建立层次结构模型(3)构造判断(成对比较)矩阵(4)一致性检验:三、层次分析法的优点与局限代码开源最后:总结系列文章目录引言层次分析......
  • 算法板子:最短路问题——包含朴素Dijkstra算法、堆优化版的Dijkstra算法、SPFA算法、Fl
    目录1.几种算法的用途2.Dijkstra算法——求源点到其他所有点的最短路径(不能处理负边权)(1)朴素Dijkstra算法——适用于稠密图(2)堆优化版的Dijkstra算法——适用于稀疏图4.SPFA算法——求源点到其他所有点的最短路径、判断是否存在负环(可以处理负边权)(1)求有负边权的图......
  • 算法板子:质数——判定质数、分解质因数、筛质数
    目录一、判定质数1.代码二、分解质因数1.质因数的概念2.代码三、筛质数——获取1~n中所有质数的个数1.合数的概念2.代码一、判定质数1.代码#include<iostream>usingnamespacestd;boolis_prime(intx){//1不是质数,需要特判if(x==1)r......
  • 回溯函数(算法)杂谈 -----可主动控制撤回逻辑处理的递归函数
    概述回溯,对接触了算法的人而言,并不陌生,其实严谨地说回溯函数就是递归函数,只不过在使用上,人们将它的一些细节抽离出来,进而演化出了所谓的回溯,在算法导论中,与其相关的被称为“回溯搜索算法”。回溯本质是递归的副产物,只要有递归调用就会有回溯。回溯法也经常和二叉树或N叉树......
  • 「代码随想录算法训练营」第三十四天 | 动态规划 part7
    198.打家劫舍题目链接:https://leetcode.cn/problems/house-robber/文章讲解:https://programmercarl.com/0198.打家劫舍.html题目难度:中等视频讲解:https://www.bilibili.com/video/BV1Te411N7SX题目状态:有点思路但不全。思路:这次的dp[i]数组表示在到第i个房间中时最多的......
  • 2024-8-9 算法学习
    P5788【模板】单调栈题意:给定一个数列,求数列中每一个元素之后第一个大于该元素的下标若存在一个数大于它之后的数,那么当我们在左边计算答案的话,那个较小的数不可能被统计到。所以利用单调栈的做法,和右边的比就从右边统计,维护一个栈就行了P6510奶牛排队题意:给定一个数列,求......