拓扑排序

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;
    }
}
原文地址:https://www.cnblogs.com/zh-xiaoyuan/p/15138074.html