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