轉自:http://blog.csdn.net/wenlei_zhouwl/article/details/6008115
對於有向無環圖DAG求單源最短路徑,可以按照圖中節點的拓撲順序來求路徑。
僞代碼:
- DagShortestPath(G, w, s)
- {
- topologically sort the nodes in G
- //initialization
- for each vertex v in G
- {
- distance[v] = infinite
- parent[v] = NULL;
- }
- distance[s] = 0
- for each vertex v in G, taken in topologically sorted order
- {
- //relax
- for each edge w[u][v]
- {
- if (distance[v] > distance[u] + w[u][v])
- {
- distance[v] = distance[u] + w[u][v]
- parent[v] = u
- }
- }
- }
- }
該算法的複雜度爲O(V + E)。
該算法的正確性可由路徑鬆弛原理證得:對於節點v,如果s->v存在最短路徑(v0, v1, ..., vk),則只要保證路徑被鬆弛的順序爲(v0, v1),(v1, v2),...,(vk-1, vk)。
求關鍵路徑時,可以通過把邊權值取負值來實現。