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;
        }
    }
  • 相关阅读:
    Pythoy 数据类型序列化——json&pickle 模块
    Python xml 模块
    Spring MVC <mvc:annotation-driven/>的作用
    Spring MVC学习笔记
    springboot配置logback日志
    Git master合并分支时提示“Already up-to-date”
    解决idea tomcat乱码问题
    MYSQL 八大优化方案
    SpringBoot项目集成PageHelper使用
    Git--远程仓库版本回退方法
  • 原文地址:https://www.cnblogs.com/zh-xiaoyuan/p/15138074.html
Copyright © 2011-2022 走看看