图的拓扑排序,这也是给自己补上一课。
参考点击打开链接
用的是bfs来处理的。
有三个循环,
第一个是将所有有父节点的节点放进map中,并对每一个节点保存其父节点的个数;
第二个将将没有父节点的节点放进results和queue中,这些节点就是根节点,即拓扑的开端,
第三个依次将每个有父节点的节点中保存的父节点个数不断减1,清0,注意自己清0的错误
这个过程能保证顺序的
/**
* @param graph: A list of Directed graph node
* @return: Any topological order for the given graph.
*/
public ArrayList<DirectedGraphNode> topSort(ArrayList<DirectedGraphNode> graph) {
// write your code here
ArrayList<DirectedGraphNode> results = new ArrayList<>();
if (graph == null) {
return results;
}
Map<DirectedGraphNode, Integer> map = new HashMap<>();
for (DirectedGraphNode node: graph) {
for (DirectedGraphNode neighborNode: node.neighbors) {
if (map.containsKey(neighborNode)) {
map.put(neighborNode, map.get(neighborNode) + 1);
} else {
map.put(neighborNode, 1);
}
}
}
Queue<DirectedGraphNode> queue = new LinkedList<>();
for (DirectedGraphNode node: graph) {
if (!map.containsKey(node)) {
queue.offer(node);
results.add(node);
}
}
while (!queue.isEmpty()) {
DirectedGraphNode node = queue.poll();
for (DirectedGraphNode neighborNode: node.neighbors) {
map.put(neighborNode, map.get(neighborNode) - 1);
if (map.get(neighborNode) == 0) {
queue.offer(neighborNode);
results.add(neighborNode);
}
// int num = map.get(neighborNode);
// if (num != 0) {
// map.put(neighborNode, num - 1);
// } else {
// queue.offer(neighborNode);
// results.add(neighborNode);
// }
}
}
return results;
}