DAG 的最短路徑算法


    求圖中節點的單源最短路徑可以使用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;
            }
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM