Dijkstra算法理解(单源最短路径)

首先理解下Dijkstra的数学基础。见如下图片:(图片摘自(77条消息) 迪杰斯特拉算法(Dijkstra)证明_肥宅Sean-CSDN博客_dijkstra证明

 

为什么选这张图片呢?因为当时我就是从这张图片所讲的开始理解,并产生疑问,再解决疑问的。

首先 ,要将\overline{Si}中的点加入到Si中并需要是\overline{Si}中距离v_0(起始点)最小的点原因是使得v_0u_j之间的最短路径所经过的点都是在S_i中。

其次,要注意已经加入到S_i中的点实际上都已经保证了自己到v_0之间的距离一定是最小的了。

那么,接下来要向S_i中的点无非也是要保证距离起始点的距离是最小的了,那么对\overline{S_i}中的各点{u_j,u_{j+1}...,u_{n}},要找出各点距离起始点距离最小的值并进行比较,那就是要计算比较

\min_{v_i\in S_i, u_j \in \overline{S_i}}{(l(v_i)+l(v_i,u_j))}        

而实际上,每加入一个新点后,我们都会队每个\overline{S_i}中的点到v_0之间的距离进行更新,即l(u_j) = min(l(u_j), l(v_{i+1}+l(v_{i+1},u_j)))      (1)

v_{i+1}是刚被加入到S_i中的点。

这一步就使得我们不用再在每次需要添加新点时,对每个u_j计算\min_{v_i \in S_i} (l(v_i)+ l(v_i,u_j)),所以公式(1)就类似与优胜劣汰,在每次添加新点的这种循环视角看来,就是相当于做了\min_{v_i \in S_i} (l(v_i)+ l(v_i,u_j)),因此我们只需要比较上一步留下来的最短距离l(u_j)l(v_{i+1})+l(v_{i+1}, u_j)l(u_j)进行更新即可。所以有了图片中的步骤2和3。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Quillan_car

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值