了解Dijkstra算法的都知道该算法每一次都会选择distTo最小的来处理,对于边v->w,每一次都会选择distTo[]最小的来处理,在处理distTo[w]之前必须要能够保证distTo[v]已经是最小的最优的,这是保证最短路径条件成立的关键,局部最优解一步一步扩展到全局最优解,如同动态规划。
但是有一个问题为什么最小的distTo就一定是最优的呢?
假设有一个最小优先级队列mq,算法的每一步都是在执行这个式子,然后再把distTo[v]从mq里面移除,把distTo[w]添加到mq中。
由上面这个式子可以知道这一不等式必然成立,这时候因为distTo[v]是最小的,那意思就是从mq里面删除了一个最小的,加进去了一个可能会大一点的,也就是mq里面的最小值肯定是在不断增大的,至少不可能变小。如果在未来的某一步中distTo[v]又被加入到了mq中,为了和以前的distTo[v]区分,记后来加进去的是distTo[v]',那么肯定有
,也就是distTo[v]的值无法继续被缩小了(事实上这样了话distTo[v]'也根本不可能再一次被加入到mq中),所以distTo[v]的值无法继续被缩小了就是最优值。