图的拓扑排序

拓扑排序常用于编译前依赖的编译,只有上一步做完下一步才可以进行 ...

思路:  依次消除所有入度为0的节点,并消除其边的影响

public static List<Node> topology(Graph graph){
        //key 某一个节点 value 剩余的入度
        HashMap<Node,Integer> inMap = new HashMap<>();
        //只有入度为0的节点才可进入
        Queue<Node> zeroQueue = new LinkedList<>();
        //遍历图中所有节点拿到入度为0的节点
        for (Node node : graph.nodes.values()) {
            //将所有节点与其入度对应存入表
            inMap.put(node,node.in);
            //找到入度为0的点作为起点
            if(node.in == 0){
                zeroQueue.add(node);
            }
        }
        //拓扑排序的结果依次放入result
        List<Node> result = new LinkedList<>();
        while (!zeroQueue.isEmpty()){
            Node cur = zeroQueue.poll();
            result.add(cur);
            if(cur.nexts != null && cur.nexts.size() > 0){
                for (Node next : cur.nexts) {
                    inMap.put(next,inMap.get(next) - 1);
                    if(inMap.get(next) == 0){
                        //如果入度为0存入zero队列
                        zeroQueue.add(next);
                    }
                }
            }
        }
        return result;
    }

 左神算法学习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值