拓扑排序常用于编译前依赖的编译,只有上一步做完下一步才可以进行 ...
思路: 依次消除所有入度为0的节点,并消除其边的影响
public static List<Node> topology(Graph graph){
//key 某一个节点 value 剩余的入度
HashMap<Node,Integer> inMap = new HashMap<>();
//只有入度为0的节点才可进入
Queue<Node> zeroQueue = new LinkedList<>();
//遍历图中所有节点拿到入度为0的节点
for (Node node : graph.nodes.values()) {
//将所有节点与其入度对应存入表
inMap.put(node,node.in);
//找到入度为0的点作为起点
if(node.in == 0){
zeroQueue.add(node);
}
}
//拓扑排序的结果依次放入result
List<Node> result = new LinkedList<>();
while (!zeroQueue.isEmpty()){
Node cur = zeroQueue.poll();
result.add(cur);
if(cur.nexts != null && cur.nexts.size() > 0){
for (Node next : cur.nexts) {
inMap.put(next,inMap.get(next) - 1);
if(inMap.get(next) == 0){
//如果入度为0存入zero队列
zeroQueue.add(next);
}
}
}
}
return result;
}
左神算法学习