拓扑排序算法(TopologySort)

153 阅读1分钟

拓扑排序算法 适用范围:要求有向图,且有入度为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;
	}
}