自己查阅了一些相关讲解,感觉还差些严谨说明,于是写此博客。
算法思想:(一个源点,其他点为终点)对于一个终点,源点到她的路径确定从长到短;对于整个图,所有终点的最短路径寻找从近到远。
难点:为什么在循环中的一次,在所有当前未确定最短路径的点中,寻找到拥有最小的当前到源点(设点A)路长的点(设点B类点),该点在此时的路长就是她(B)到源点最短路径长。
解释:
首先A到B的长度在当前有两种可能:(1)就是当前记录的A到B的路长;(2)是A先到部分其他A与B外的点(AB外的点统称C类点,这里是部分C类点),再转到B点的路长。不存在其他可能性
然后比较这两种可能的大小:
(1)这里要证明当前记录的A到B的路长是历次记录A到B的路长中最短的:由题易得(手动doge)我们的算法就是当有更小时会替代,好像也可以加上数学归纳法
(2)这里先证明A到这部分C类点的过程中没有遇到B:我们只有当某终点符合B类点特征的时候,才确认该点已经找到最短路径,并下次循环从该点向所有子结点探索,也就是说,只要该点没有符合B类点特征,她所在的路相当于被堵住不会往下延伸;
再证明这部分C类点已经包含了所有到B的可能性:因为我们每次循环都把新确认最短路径的终点的所有子结点探索了,这就像是一栋大楼,我已经找到所有的入口(刚提及的所有子结点和其他除B的被堵住的点)找到了,虽然不知道大楼里面怎么走,但最后一定从唯一的出口(B)出去(存在没出口即没中转点再指向B的情况,这样更简单,无须证明显然此时B的路长就是最短)。
因为B的特征就是(1)比所有(2)情况的路长都小,所以B被确定已经找到最短路径,即数组中记录的路长
更新:如果当前最小路长的B类点有一个以上,则选择其中一个点确定其已经有最短路径,然后在该点基础上延伸探索,下一循环中再进行路长排序,如此上一循环有相同路长的B类点在此次循环将成为最小路长的点