求圖中節點的單源最短路徑可以使用Dijkstra,BellmanFord, SPFA算法,而對於有向無環圖DAG來說,可以通過簡單的動態規划來進行求解。
DAG的獨特之處是所有節點可以線性化(拓撲序列),使得所有邊保持從左到右的方向,如下圖: 
思路
動態規划的遞推需要一個線性或者樹形的順序,對於DAG,我們可以將節點按照拓撲順序來進行線性化,這樣就可以來進行遞推。
拓撲順序中節點v排在節點u之后,則只有可能從u到達v,而不能反過來;對於當前的節點v,在拓撲序列中向前查找,可能找到一些可以到達該頂點的其他節點,然后利用 dist[v] = min{dist[u] + w[u][v] | u 可以到達v} 來進行動態規划的遞推。
偽碼
DagShortestPath(G, w, s){
對節點按照拓撲順序進行排序
topologically sort the nodes in G
初始化
for each vertex v in G{
dist[v] = INF;
pre[v] = NULL;
}
dist[s] = 0;
//根據拓撲順序,遍歷頂點v
for each v in G, taken in topologically sorted order{
for each edge w[u][v]{
if (dist[v] > dist[u] + w[u][v]){
pre[v] = dist[u] + w[u][v];
pre[v] = u;
}
}
}
}
