【每日一题Day279】LC2050并行课程 III | 拓扑排序

简介: 【每日一题Day279】LC2050并行课程 III | 拓扑排序

并行课程 III【LC2050】

给你一个整数 n ,表示有 n 节课,课程编号从 1n 。同时给你一个二维整数数组 relations ,其中 relations[j] = [prevCoursej, nextCoursej]表示课程 prevCoursej 必须在课程 nextCoursej 之前 完成(先修课的关系)。同时给你一个下标从 0 开始的整数数组 time ,其中 time[i] 表示完成第 (i+1) 门课程需要花费的 月份 数。

请你根据以下规则算出完成所有课程所需要的 最少 月份数:

  • 如果一门课的所有先修课都已经完成,你可以在 任意 时间开始这门课程。
  • 你可以 同时任意门课程

请你返回完成所有课程所需要的 最少 月份数。

**注意:**测试数据保证一定可以完成所有课程(也就是先修课的关系构成一个有向无环图)。

image.png

class Solution {
    public int minimumTime(int n, int[][] relations, int[] time) {
        List<Integer>[] g = new List[n];
        Arrays.setAll(g, e -> new ArrayList<>());
        int[] costs = new int[n];
        int[] inDeg = new int[n];
        Deque<Integer> queue = new LinkedList<>();
        // 邻接表
        for (int[] relation : relations){
            int u = relation[0] - 1, v = relation[1] - 1;
            g[u].add(v);
            inDeg[v]++;
        }
        // dp计算最少月份数 修完某课程的最少月份数为其先修课的最大时间+其完成需要的时间
        // dp[v] = time[v] + max(dp[u]);
        int res = 0;        
        // 入度
        for (int i = 0; i < n; i++){
            if (inDeg[i] == 0){
                queue.addLast(i);
            }
        }
        // 拓扑排序
        while (!queue.isEmpty()){
            int u = queue.pollFirst();
            costs[u] += time[u];
            res = Math.max(res, costs[u]);
            // order[index++] = u;
            for (int v : g[u]){
                costs[v] = Math.max(costs[v], costs[u]);
                if (--inDeg[v] == 0){
                    queue.addLast(v);
                }
            }             
        }
        return res;
    }
}

image.png

目录
相关文章
|
6月前
【每日一题Day258】LC2532过桥的时间 | 模拟 优先队列
【每日一题Day258】LC2532过桥的时间 | 模拟 优先队列
42 0
|
6月前
|
分布式计算 算法 测试技术
【动态规划】【状态压缩】【2次选择】【广度搜索】1494. 并行课程 II
【动态规划】【状态压缩】【2次选择】【广度搜索】1494. 并行课程 II
|
6月前
【每日一题Day239】LC1494并行课程 II | 状态压缩 dp 位运算 子集
【每日一题Day239】LC1494并行课程 II | 状态压缩 dp 位运算 子集
45 0
|
6月前
|
人工智能 BI
【每日一题Day321】LC207课程表 | 拓扑排序
【每日一题Day321】LC207课程表 | 拓扑排序
39 0
|
6月前
|
人工智能 BI
【每日一题Day322】LC210课程表 II | 拓扑排序
【每日一题Day322】LC210课程表 II | 拓扑排序
34 0
|
6月前
【每日一题Day355】LC1402 做菜顺序 | 贪心+排序
【每日一题Day355】LC1402 做菜顺序 | 贪心+排序
45 0
|
搜索推荐 算法
数据结构实验课:实验八、排序算法的实现
数据结构实验课:实验八、排序算法的实现
459 0
数据结构实验课:实验八、排序算法的实现
【每日一题Day103】LC1669合并两个链表 | 模拟
思路:遍历链表找到list1中的第a−1个节点和第b+1个节点,然后将第a−1个节点指向list2链表的初始节点,list2链表的尾节点指向list1中的第b+1个节点
83 0
【每日一题Day103】LC1669合并两个链表 | 模拟
【每日一题Day62】LC1760袋子里最少数目的球 | 二分查找
首先,将题意转化为,当操作次数一定时,求出单个袋子里球的数目的最大值的最小值y yy,那么可以通过二分查找的方法找到最终的y yy,二分查找的下限为1,上限为数组nums中的最大值
114 0
【每日一题Day62】LC1760袋子里最少数目的球 | 二分查找
|
存储 人工智能 算法
数据结构实验课:实验六、图的遍历操作及应用
数据结构实验课:实验六、图的遍历操作及应用
358 0
数据结构实验课:实验六、图的遍历操作及应用