拓扑排序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);
    }

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