拓扑排序是对有向无环图进行操作。简单来说一个结点可能由其他的结点指向他,要想生成这个结点必须先生成指向他的结点。也就是说一个图的入度为0的结点先输出,之后他们指向的结点的入度减一,再从剩下的入度为0的输出,直到全部输出。代码如下所示:
public class TopologySort {
public static List<Node> sortedTpology(Graph graph) {
HashMap<Node, Integer> inMap = new HashMap<>();
Queue<Node> zeroInQueue = new LinkedList<>();
for(Node node : graph.nodes.values()) {
inMap.put(node, node.in);
if(node.in == 0) {
zeroInQueue.add(node);
}
}
List<Node> result = new ArrayList<>();
while(!zeroInQueue.isEmpty()) {
Node cur = zeroInQueue.poll();
result.add(cur);
for(Node next : cur.nexts) {
inMap.put(next,inMap.get(next) - 1);
if(inMap.get(next) == 0) {
zeroInQueue.add(next);
}
}
}
return result;
}
}
关于Node和Graph的结构可以看我上一篇博客。