算法简述
众所周知,迪杰斯特拉每次选的是和源点最近的点,然后拓展。注意和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‘不可能是最短路,矛盾。

903

被折叠的 条评论
为什么被折叠?



