Dijkstra算法

 

 

注意,Dijksrta算法的精髓在于有两个表:假设是CLOSE表和OPEN表。最开始假设只有源点S在CLOSE表中。OPEN表中有很多个点A、B、C、D、E...

第一步:先求CLOSE表中所有点到CLOSE表中所有点的距离,即求源点S到OPEN表中所有点的距离。取最小的那个距离,比如说是A点。则SA之间的直接路径一定是源点S到A的最短路径。我们用反证法:假设CLOSE表中存在一点B,使得SB+BA<SA,则SB<SA,这显然与SA是源点S到OPEN表中所有点的距离中最小的相矛盾。既然确定了S到A的最短路径,就可以把A点放入到CLOSE表中了。现在CLOSE表中有2个点S、A。OPEN表中还剩余B、C、D、E...。求CLOSE表中S到OPEN表中的X点的直接距离SX(stright),再求SA+A到OPEN表中X点的距离,取两者中更小的那个作为S到OPEN表中X点的距离,即SX=min{SX(stright),SA+AX},X={B,C,D,E...};

第二步:取上一步中的SX中最小的那个,比如说这个X是B,即SB=min{SX},X={B,C,D,E...}。可以证明,S到B点的最短距离SB=min{SB(stringh),SA+AB}。反证法:假设OPEN表中存在一点Y使得SY(stright)+YB<SB,则SY(stright)<SB,这与上一步中SB=min{SX} < SY=min{SY(stright),SA+AY} <= SY(stright)相矛盾。则将B加入CLOSE中,这样CLOSE表中就有3个点{S、A、B}了。而OPEN表中还剩{C、D、E...}。像上一步一样,更新S到所有点的距离,即SX=min{SX,SA+AX,SB+BX},X={C,D,E...};

第三步:反复执行步骤二,直至OPEN表为空,此时的SX即为源点S到所有点X的最短距离;

 

讨论:Dijkstra算法是基于贪心算法的,所以它不能计算权值为负的边的最小距离。

转载于:https://www.cnblogs.com/jswu-ustc/p/9073624.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值