Dijkstra最短路径算法每次都要选择最小的distTo[v]

博客探讨了Dijkstra算法如何通过每次选择最小distTo值确保找到最短路径。算法利用最小优先级队列,逐步扩展局部最优解至全局最优解。文章指出,distTo[v]一旦是最小值,就不会再减小,从而保证了路径的最优化。
摘要由CSDN通过智能技术生成

了解Dijkstra算法的都知道该算法每一次都会选择distTo最小的来处理,对于边v->w,每一次都会选择distTo[]最小的来处理,在处理distTo[w]之前必须要能够保证distTo[v]已经是最小的最优的,这是保证最短路径条件成立的关键,局部最优解一步一步扩展到全局最优解,如同动态规划。

但是有一个问题为什么最小的distTo就一定是最优的呢?

假设有一个最小优先级队列mq,算法的每一步都是在执行这个式子distTo[w] = \min\{distTo[w], distTo[v]+weight(v,w)\},然后再把distTo[v]从mq里面移除,把distTo[w]添加到mq中。

由上面这个式子可以知道distTo[w]\ge distTo[v]这一不等式必然成立,这时候因为distTo[v]是最小的,那意思就是从mq里面删除了一个最小的,加进去了一个可能会大一点的,也就是mq里面的最小值肯定是在不断增大的,至少不可能变小。如果在未来的某一步中distTo[v]又被加入到了mq中,为了和以前的distTo[v]区分,记后来加进去的是distTo[v]',那么肯定有distTo[v]\le distTo[v]',也就是distTo[v]的值无法继续被缩小了(事实上这样了话distTo[v]'也根本不可能再一次被加入到mq中),所以distTo[v]的值无法继续被缩小了就是最优值。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值