迪杰斯特拉的最短路证明

迪杰斯特拉的最短路证明

算法简述

众所周知,迪杰斯特拉每次选的是和源点最近的点,然后拓展。注意和prim的区别。prim的dist是定义的每个点和已经确定集合的距离,而迪杰斯特拉的是和源点的距离。

证明

用数学归纳法。
假设前n个点已经确定的dist是正确的。那么要证明第n+1个点x,即剩下的里面最小的点的dist也是正确的,也就是证明这条从源点走经过一系列n点集合里的点的路径path是x的最短路。
假设第n+1个点的dist不正确,那就是说最短路不是path。现在有两种情况:

  • 1.x的最短路是另一条路path‘。path‘除了x其他都是n点集合里的点。设path‘经过的最后一个n集合中的点是k‘,那么又分了两种情况:
    • (1)k’=k。根据前n个点都对的假设, l e n ( p a t h ) ≤ l e n ( p a t h ′ ) len(path)\le len(path') len(path)len(path)
    • (2)k’!=k。根据假设 d i s t k ′ + d i s t ( k ′ , x ) < d i s t k + d i s t ( k , x ) dist_{k'}+dist(k',x)<dist_k+dist(k,x) distk+dist(k,x)<distk+dist(k,x)但是根据算法找的是最小值,所以这是不成立的。
  • 所以,如果想要有更短的路径,只能经过n点集合外面的点。设真正的源点到x的最短路为path‘。path’经过的第一个集合外面的点k,k!=x。那么根据前n个点都是正确最短路的假设,这个k的最短路一定是 d i s t k dist_k distk。那么根据算法设定和无负权边的设定,一定有 l e n ( p a t h ′ ) = d i s t k + d i s t ( k , x ) > d i s t k > d i s t x len(path')=dist_k+dist(k,x)>dist_k>dist_x len(path)=distk+dist(k,x)>distk>distx所以path‘不可能是最短路,矛盾。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值