1. 程式人生 > 其它 >拓撲排序演算法

拓撲排序演算法

有向圖,無環, 有入度為零 的 點

  • 先看哪個點是入度為0的點 比如A
  • 然後把 以 A出發的 路徑叉掉
  • 找下一個入度為0的點 。 重複操作
public static void sortedTopology(Graph graph) {
    // 拓撲排序
    // 儲存 節點剩餘的入度
    HashMap<Node, Integer> inMap = new HashMap<>();

    // 儲存 入度為0 的節點 的佇列
    LinkedList<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);
            // 如果當前節點的入度為0,也加入 zeroInQueue
            if(inMap.get(next) == 0){
                zeroInQueue.add(next);
            }
        }
    }
}