拓扑排序
1、有向图中依次找到所有入度为0的点,把这些点输出,再把这些点的影响(由这个先散发出的线)擦掉
2、在剩下的图中肯定还有入度为0的点,循环步骤1
代码实现:
package Algorithms.Graph; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Queue; public class TopologySort { // directed graph and no loop public static List<Node> sortedTopology(Graph graph) { // key:某一个node // value:剩余的入度 HashMap<Node, Integer> inMap = new HashMap<>(); //入度为0的点,才能进这个队列 Queue<Node> zeroInQueue = new LinkedList<>(); //先把每个点真实的入度记录到inmap中 for (Node node : graph.nodes.values()) { inMap.put(node, node.in); if (node.in == 0) { //找到了这张图中第一批入度为0的点 zeroInQueue.add(node); } } //拓扑排序的结果,依次加入到列表result中 List<Node> result = new ArrayList<>(); while (!zeroInQueue.isEmpty()) { Node cur = zeroInQueue.poll(); //弹出入度为0的点 result.add(cur); //加入到result中 //擦掉这个点的所有影响 for (Node next : cur.nexts) { inMap.put(next, inMap.get(next) - 1); //让这个点所有的next点的入度都减1 if (inMap.get(next) == 0) { //如果发现某一个点的入度减为0 zeroInQueue.add(next); //加入到zeroInQueue中 } } } return result; } }