单源最短路径问题就是给定你一个有向图G = (V, E),找出一个点到另一个点的最短路径。
这里用Dijkstra's algorithm来找出最短路径。
这个算法是通过为每个顶点v保留目前为止所找到的从s到v的最短路径来工作的。初始时,原点 s 的路径长度值被赋为 0 (d[s]= 0),同时把所有其他顶点的路径长度设为无穷大,即表示我们不知道任何通向这些顶点的路径(对于V中所有顶点v除s外d[v]= ∞)。当算法结束时,d[v]中储存的便是从s到v的最短路径,或者如果路径不存在的话是无穷大。 Dijkstra 算法的基础操作是边的拓展:如果存在一条从u到v的边,那么从s到v的最短路径可以通过将边(u,v)添加到尾部来拓展一条从 s 到 u 的路径。这条路径的长度是 d[u] + w(u, v)。如果这个值比目前已知的d[v]的值要小,我们可以用新值来替代当前d[v]中的值。拓展边的操作一直执行到所有的 d[v] 都代表从 s 到 v 最短路径的花费。这个算法经过组织因而当d[u]达到它最终的值的时候每条边(u,v)都只被拓展一次。
算法维护两个顶点集 S 和 Q。集合 S 保留了我们已知的所有 d[v] 的值已经是最短路径的值顶点,而集合 Q 则保留其他所有顶点。集合S初始状态为空,而后每一步都有一个顶点从 Q 移动到 S。这个被选择的顶点是 Q 中拥有最小的 d[u] 值的顶点。当一个顶点 u 从 Q 中转移到了 S 中,算法对每条外接边 (u, v) 进行拓展。
1 function Dijkstra(G, w, s) 2 for each vertex v in V[G] // 初始化 3 d[v] := infinity 4 previous[v] := undefined 5 d[s] := 0 6 S := empty set 7 Q := set of all vertices 8 while Q is not an empty set // Dijkstra演算法主體 9 u := Extract_Min(Q) //在Q中离S最近的点,在第一次的时候,我们要先得到和S点直接连接点的距离,然后再做选择 10 S := S union {u} 11 for each edge (u,v) outgoing from u 12 if d[v] > d[u] + w(u,v) // 拓展边(u,v) 13 d[v] := d[u] + w(u,v) 14 previous[v] := uDijkstra's algorithm 的复杂度为 O(V^2).
http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm
http://www.cnblogs.com/xiaosuo/archive/2010/03/23/1656921.html