次序产生最短路径的思想,当前最短距离最小的V—S点集中点k的最短路径是:
源点,s1,s2,? ,sn,k。
距离为:源点到点sn最短距离+n,k>边长。
为求解方便,设置一个向量D[0..n一1],对于每个V—S点集中的点v∈V—S,用D[v]记录从源点s到达v且除v外中间不经过任何V—S点集中的点(若有中间点,则必为S点集中的点)的“最短”路径长度(简称估计距离)。
若k是V—S点集中估计距离最小的顶点,则k的估计距离就是最短距离,即若D[k]=min{D[i],i∈V— S},则D[k]=SD(k)。
初始时,每个V—S点集中的点v的D[c]值应为权w,v>,且从s到v的路径上没有中间点,因为该路径仅含一条边,v>。
在V—S点集中选择一个最短距离最小的点k来扩充S点集是Dijkstra算法的关键。
(4)k扩充点集S后,V—S点集估计距离的修改
将k扩充到S点集后,剩余V—S点集中的点的估计距离可能由于增加了新点k而减小,此时必须调整相应V—S点集中的点的估计距离。
对于任意的V—S点集中的点j,若k从V—S点集变成后S点集后使D[j]变小,则必定是由于存在一条从s到j且包含新点k的更短路径:P=,?,k,j>。且D[j]减小的新路径P只可能是由于路径,?,k>和边,j>组成。
所以,length(P)=D[