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算法是基于贪心算法的,所以它不能计算权值为负的边的最小距离。