求单源最短路径用得最多的算法应该就是Dijstra算法了,但是该算法有一个缺点就是不能处理负权,如果遇到负权大家可以参考后面介绍的BellMan Ford算法进行处理。
下面介绍下Dijstra算法的主要步骤:
1. 初始化集合U,该集合表示已经入选最小的节点集合
2. 初始化D,该数组表示源点s到该点的最小距离,没有直接相连则视为无穷大
3. 选出距离源点最小距离的点w
4. 对直接与w点相连的点进行处理,D[v] ← min(D[v], D[w] + A[w][v]):即对与w点直接相连的点,如果存在一条更短路劲达到该点,则刷新该点的D值。
Dijkstra(s, A, D)
U = {s};
for each vertex v
D[v] ← A[s][v]
while U ≠ V
Select vertex w ∈ V-U with minimum D[w]
U ← U ∪ {w}
for each vertex v adjacent to w
D[v] ← min(D[v], D[w] + A[w][v])