Dijkstra算法的讲解

本文详细解释了在寻找图中从源点到终点的最短路径过程中,如何在每次循环中确定B类点的最短路径,以及更新策略。关键在于证明A到B的直接路径和通过C类点间接路径的比较,确保找到最优解。
摘要由CSDN通过智能技术生成

自己查阅了一些相关讲解,感觉还差些严谨说明,于是写此博客。

算法思想:(一个源点,其他点为终点)对于一个终点,源点到她的路径确定从长到短;对于整个图,所有终点的最短路径寻找从近到远。

难点:为什么在循环中的一次,在所有当前未确定最短路径的点中,寻找到拥有最小的当前到源点(设点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类点在此次循环将成为最小路长的点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值