拓撲排序DFS做法

(1) 給定一個有向圖,在拓撲排序中可以有很多個正確解,由若干小段的 list 組成。

(2) 正確的單序列順序(具體到一個list之間的元素)

(3) 正確的全序列順序(list彼此之間的順序,可以有多個)


e.g.,

以下圖爲例,不論先從哪個點開始 DFS,例如 dfs(belt)會得到一個 belt -> jacket 的 list; 但同時因爲 pants -> belt,在最終的結果中,包含 pants->belt 的 list 要排在包含 belt->jacket的 list 前面。 



算法如下:

(1) DFS 得到一個符合正確拓撲順序的 list,保證單序列順序

(2) 每次新的list 要排在之前結果的前面,保證全序列順序

Code:

public ArrayList<DirectedGraphNode> topSort(ArrayList<DirectedGraphNode> graph) {

ArrayList<DirectedGraphNode> res = new ArrayList<DirectedGraphNode>();

HashSet<DirectedGraphNode> visited = new HashSet<DirectedGraphNode>();

for(DirectedGraphNode root : graph){
            dfs(list, root, visited);
        }

return res;

}


private void dfs(LinkedList<DirectedGraphNode> list, DirectedGraphNode root, HashSet<DirectedGraphNode> visited){

        if(visited.contains(root)) return;
        for(DirectedGraphNode next : root.neighbors){
            dfs(list, next, visited);
        }
       
list.addFirst(root);
        visited.add(root);
    }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章