首页 > 编程语言 > 详细

Dijkstra算法

时间:2018-05-22 20:08:26      阅读:226      评论:0      收藏:0      [点我收藏+]

 

技术分享图片

技术分享图片

技术分享图片

技术分享图片

技术分享图片

 

注意,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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!