维基百科上写的还比较清楚。dj算法是求单源最短路径的算法。
function Dijkstra(G, w, s)
for each vertex v in V[G] // 初始化
d[v] := infinity // 将各点的已知最短距离先设置成无穷大
previous[v] := undefined // 各点的已知最短路径上的前趋都未知
d[s] := 0 // 因为出发点到出发点间不需移动任何距离,所以可以直接将s到s的最小距离设为0
S := empty set
Q := set of all vertices
while Q is not an empty set // Dijkstra演算法主體
u := Extract_Min(Q)
S.append(u)
for each edge outgoing from u as (u,v)
if d[v] > d[u] + w(u,v) // 拓展边(u,v)。w(u,v)为从u到v的路径长度。
d[v] := d[u] + w(u,v) // 更新路径长度到更小的那个和值。
previous[v] := u // 记录前趋顶点
上面是伪代码。其中previous是记录了一个节点的前驱。这是为了在找到最短路径之后能从路径终点回溯到起始点。
回溯过程如下:
1 s := empty sequence
2 u := t
3 while defined u
4 insert u to the beginning of S
5 u := previous[u] //previous数组即为上文中的p
序列S中就是从起始点到t点的路径了。
其中Extract_Min方法是找到S集合中到Q集合的最短路径长度所对应的那个点u,然后把u加到S集合中【Q集合在慢慢减小直到为空】。
Extract_Min可以使用一个数组,每次遍历数组来找到最小值。也可以使用其他稍微优化的方法,比如说小顶堆。