单源最短路径中Dijkstra算法正确性

单源最短路径

Dijkstra算法正确性

注:要证明算法的正确性,也即证明下述命题的正确性:

命题:在单源最短路径中,Dijkstra算法通过贪心策略取得的解是整体最优解。

也即局部最优解为整体最优解

贪心选择性质

从源v到u,我们选择在当前S内,从源v到点u的最短距离dist[u](局部最优解)

若想推翻命题,那么我们需要找到另外一条路径,使得从源v到u的距离小于dist[u]。

其表达目的:在单源最短路径中,局部最优解不能作为整体最优解。

假设存在这样的一条路径,从S先到x,然后徘徊于S内外(目的:扩展当前S),然后再到u,得到解优于dist[u]。

此时,距离可表述为: d ( v , x ) + d ( x , u ) d(v,x)+d(x,u) d(v,x)+d(x,u)

因为边权非负,所以 d ( x , u ) > 0 d(x,u)\gt0 d(x,u)>0,同时 d i s t [ x ] < d ( v , x ) dist[x]<d(v,x) dist[x]<d(v,x),并且 d i s t [ u ] < d i s t [ x ] dist[u]<dist[x] dist[u]<dist[x](因为u为当前S的最优解)。

d i s t [ u ] < d i s t [ x ] < d ( v , x ) + d ( x , u ) dist[u]<dist[x]<d(v,x)+d(x,u) dist[u]<dist[x]<d(v,x)+d(x,u),故而找不到一条这样的路径,于是命题得证。

最优子结构性质

性质描述为,如 S ( i , j ) = v i . . . v k . . . v s . . . v j S(i,j)={v_i...v_k...v_s...v_j} S(i,j)=vi...vk...vs...vj是从i到j的最短路径,那么从k到s的路径则为 S ( k , s ) S(k,s) S(k,s)

证明

假设从k到s之间存在一条路径 S ′ ( k , s ) S'(k,s) S(k,s),其距离小于 S ( k , s ) S(k,s) S(k,s)

因为 S ( i , j ) = S ( i , k ) + S ( k , s ) + S ( s , j ) S(i,j)=S(i,k)+S(k,s)+S(s,j) S(i,j)=S(i,k)+S(k,s)+S(s,j),所以必然存在一条路径 S ′ ( i , j ) = S ( i , k ) + S ′ ( k , s ) + S ( s , j ) < S ( i , j ) S'(i,j)=S(i,k)+S'(k,s)+S(s,j)\lt S(i,j) S(i,j)=S(i,k)+S(k,s)+S(s,j)<S(i,j),与原假设矛盾。

因此,原命题正确。


因为博主写也只是在学习过程中做个人总结,所以难免可能会有错误的地方,欢迎大家一起交流、讨论。如果有幸解决了您的一些疑问,本人不胜感激!

  • 8
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值