笔记:dijkstra算法正确性证明与猜想

本文通过一种不同的视角证明Dijkstra算法的正确性。初始时S为空集,V为所有顶点。首先将源点加入S,然后逐步更新最短路径。文中详细探讨了在算法过程中可能出现的情况,包括权值的比较和状态更新,揭示了Dijkstra算法如何确保找到最短路径。通过分析,作者指出Dijkstra算法与KMP等算法一样,基于动态规划思想构建系统状态,逐步解决问题。
摘要由CSDN通过智能技术生成

不妨设dij后得到的最短路径 <S,V> 集合初始时S为空集,V为每个顶点组成的集合;

初始时,S为空集,确定源点后加入源点a,此时V中元素仍为V。(大部分证明都把V认为是所有源点的集合减去已经确定最短路的集合,此处使用另一种形式证明)

加入a后能得到一条最短路,此处将a到a的距离认为是0,则此时能够得到一条最短路即a到a自身;

a加入S后,把a经过一条以a为起点的边对应到每个源点的权值更新,若a与某源点没有边则记为NO;选择其中权值最小且未被选取过的顶点b;按照dij的思想,(a,b)的权值即dis[a][b]即为a到b的最短路,记为ans[b];此处严格证明这一观点,这也是dij的核心;

存在某一点c,使得dis[a][c]+dis[c][b]<ans[b],分两种情况讨论:若c已经在集合S中且未被选取过,由于dis[c][b]非负,立即求得dis[a][c]即ans[c]<ans[b],这与每次选取ans中未被选取过且权值最小的点不符,立即推得矛盾;

若c是已经被选取过的点,则当选取c时就已经更新了ans[b],那么就成了伪命题;

除此之外的疑问是c未被选取过但就是能确定从c作为起点到达b能得到最短路,那么想得到最终正确的ans[b],必须把c加入后再重新更新ans[b],这种问题的判定稍微复杂;

此处我把a到c的权值分为2种情况;1是在选取b节点时已经得到了ans[c]不为NO,2是未确定ans[c]即ans[c]==NO;

对1

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值