单源最短路径
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),与原假设矛盾。
因此,原命题正确。
因为博主写也只是在学习过程中做个人总结,所以难免可能会有错误的地方,欢迎大家一起交流、讨论。如果有幸解决了您的一些疑问,本人不胜感激!