(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);
}