zoukankan      html  css  js  c++  java
  • 拓扑排序

    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;
        }
    }
  • 相关阅读:
    December 23rd 2016 Week 52nd Friday
    December 22nd 2016 Week 52nd Thursday
    December 21st 2016 Week 52nd Wednesday
    December 20th 2016 Week 52nd Tuesday
    December 19th 2016 Week 52nd Sunday
    December 18th 2016 Week 52nd Sunday
    uva294(唯一分解定理)
    uva11624Fire!(bfs)
    fzu2150Fire Game(双起点bfs)
    poj3276Face The Right Way
  • 原文地址:https://www.cnblogs.com/zh-xiaoyuan/p/15138074.html
Copyright © 2011-2022 走看看