拓扑排序算法 适用范围:要求有向图,且有入度为0的节点,且没有环
1.将图中的所有节点全部记录到HashMap,入度为零的节点添加到zeroInQueue
2.建立一个集合用来存放结果
3.从zeroInQueue中弹出一个,遍历她的子节点
4.将其子节点入度减一
5.如果这个子节点的入度为零了,就将其放入到zeroInQueue中
图的表示和生成见:点击打开链接
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
public class TopologySort {
public static List<Node> topologySort(Graph graph) {
HashMap<Node, Integer> inMap = new HashMap<Node, Integer>();
Queue<Node> zeroInQueue = new LinkedList<Node>();
for (Node node : graph.nodes.values()) {
inMap.put(node, node.in);// 遍历所有的点记录几点及其入度
if (node.in == 0) {// 登记点及其入度
zeroInQueue.add(node);// 如果入度是0就添加到zeroInQueue
}
}
List<Node> list = new ArrayList<Node>();
while (!zeroInQueue.isEmpty()) {
Node cur = zeroInQueue.poll();
list.add(cur);
for (Node next : cur.nexts) {
inMap.put(next, inMap.get(next) - 1);// node的下一节点入度减一
if (inMap.get(next) == 0) {//next.in == 0是错误的,应该写更新的了节点
zeroInQueue.add(next);
}
}
}
return list;
}
}