问题描述
什么时拓扑排序呢?
拓扑排序,实际上是来解决一些有先后问题的图的算法,比如,我们引入的jar包会互相依赖,但是,这个依赖是有先后的。或者再换个例子,组装汽车时,必须有先后顺序的,有些零件就必须在其他装好之后再组装,拓扑排序就是在解决这种问题,先后执行的问题。
拓扑排序,一般是通过入度来表示先后顺序,当一个节点的入度为0时,表示它应该最先执行。
因此,题目就转换成,我们先打印入度为0的节点,然后依次将这个节点指向的节点的入度减1,然后再判断是否有入度为0 的节点,然后再重复上述步骤。
代码
public static List<Node> sortedTopology(Graph graph){
HashMap<Node,Integer> map=new HashMap<>();
Queue<Node> queue=new LinkedList<>();
ArrayList<Node> list=new ArrayList<>();
for (Node node : graph.nodes.values()){
map.put(node,node.in);
if(node.in==0){
queue.add(node);
}
}
while (!queue.isEmpty()){
Node cur=queue.poll();
list.add(cur);
for (Node n : cur.nexts){
map.put(n,map.get(n)-1);
if(map.get(n)==0){
queue.add(n);
}
}
}
return list;
}