拓扑排序

拓扑排序(Toplogical Sort)从一组有依赖关系的任务中得到一个能完成所有任务的序列。

如图所示,有5个任务:0、1、2、3、4。其中有依赖关系:

0必须在1和2之前完成;

1必须在2之前完成;

2必须在3和4之前完成;

3必须在4之前完成。

这样一组有依赖关系的任务可以看成是一个有向图,其中图的顶点是任务,有向边是依赖关系。

根据此图一个能完成所有任务的序列是:0 -> 1 -> 2 -> 3 -> 4。

排序算法步骤

顶点的入度是指在图中终点为该顶点的边的数量。

1 初始化排序结果为一个空的列表

2 选取入度为0的顶点加到排序结果列表的最后

3 在图中删除这个顶点,如果所有顶点都从图中删除了则结束,否则回到步骤2

java代码实现

import java.util.*;

public class TopologicalSort {

    public static List<Integer> topologicalSort(Map<Integer, List<Integer>> graph) {
        Map<Integer, Integer> inDegree = new HashMap<>();
        for (List<Integer> toList : graph.values()) {
            for (int v : toList) inDegree.put(v, inDegree.getOrDefault(v, 0) + 1);
        }
        List<Integer> open = new ArrayList<>();
        for (int v : graph.keySet()) if (!inDegree.containsKey(v)) open.add(v);
        List<Integer> sorted = new ArrayList<>();
        while (!open.isEmpty()) {
            int v = open.remove(open.size() - 1);
            sorted.add(v);
            for (int toV : graph.get(v)) {
                inDegree.put(toV, inDegree.get(toV) - 1);
                if (inDegree.get(toV) <= 0) open.add(toV);
            }
        }
        return sorted.size() == graph.size() ? sorted : null;
    }

    public static void main(String[] args) {
        Map<Integer, List<Integer>> graph = new HashMap<>();
        graph.put(0, Arrays.asList(1, 2));
        graph.put(1, Arrays.asList(2));
        graph.put(2, Arrays.asList(3, 4));
        graph.put(3, Arrays.asList(4));
        graph.put(4, Arrays.asList());
        System.out.println(topologicalSort(graph));  // [0, 1, 2, 3, 4]
    }
}

源代码地址https://github.com/SSSxCCC/Algorithm

评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SSSxCCC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值