Dijkstra算法

Posted 8号prince

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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算法的主要内容,如果未能解决你的问题,请参考以下文章

最短路径(Dijkstra算法)

关于Dijkstra算法

课上Dijkstra算法练习

最短路径Dijkstra算法和Floyd算法整理

图-最短路径-Dijkstra及其变种

利用dijkstra算法规划线路