LC-2050. 并行课程 III(小根堆 + 拓扑排序)

news2024/9/22 3:33:08

2050. 并行课程 III

难度困难42

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

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

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

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

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

示例 1:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0iyNVef6-1690508561007)(LC-2050.assets/ex1.png)]

输入:n = 3, relations = [[1,3],[2,3]], time = [3,2,5]
输出:8
解释:上图展示了输入数据所表示的先修关系图,以及完成每门课程需要花费的时间。
你可以在月份 0 同时开始课程 1 和 2 。
课程 1 花费 3 个月,课程 2 花费 2 个月。
所以,最早开始课程 3 的时间是月份 3 ,完成所有课程所需时间为 3 + 5 = 8 个月。

示例 2:

img

输入:n = 5, relations = [[1,5],[2,5],[3,5],[3,4],[4,5]], time = [1,2,3,4,5]
输出:12
解释:上图展示了输入数据所表示的先修关系图,以及完成每门课程需要花费的时间。
你可以在月份 0 同时开始课程 1 ,2 和 3 。
在月份 1,2 和 3 分别完成这三门课程。
课程 4 需在课程 3 之后开始,也就是 3 个月后。课程 4 在 3 + 4 = 7 月完成。
课程 5 需在课程 1,2,3 和 4 之后开始,也就是在 max(1,2,3,7) = 7 月开始。
所以完成所有课程所需的最少时间为 7 + 5 = 12 个月。

提示:

  • 1 <= n <= 5 * 104
  • 0 <= relations.length <= min(n * (n - 1) / 2, 5 * 104)
  • relations[j].length == 2
  • 1 <= prevCoursej, nextCoursej <= n
  • prevCoursej != nextCoursej
  • 所有的先修课程对 [prevCoursej, nextCoursej] 都是 互不相同 的。
  • time.length == n
  • 1 <= time[i] <= 104
  • 先修课程图是一个有向无环图。

优先队列 + 拓扑排序

class Solution {
    public int minimumTime(int n, int[][] relations, int[] time) {
        int[] indegree = new int[n];
        List<Integer>[] g = new ArrayList[n];
        Arrays.setAll(g, e -> new ArrayList<>());
        for(int[] re : relations){
            int x = re[0] - 1, y = re[1] - 1;
            g[x].add(y);
            indegree[y] += 1;
        }
        // node, time(当前node学习完的时间)
        // 小根堆,按照课程完成时间从小到大排序
        PriorityQueue<int[]> pq = new PriorityQueue(new Comparator<int[]>() {
            @Override
            public int compare(int[] a, int[] b) {
                return a[1] - b[1];
            }
        }); 
        for(int i = 0; i < n; i++)
            if(indegree[i] == 0)
                pq.add(new int[]{i, time[i]});
        int ans = 0;
        while(pq.size() > 0){
            int[] p = pq.poll();
            int x = p[0], endtime = p[1];
            ans = Math.max(ans, endtime);
            for(int y : g[x]){
                if(--indegree[y] == 0)
                    pq.add(new int[]{y, endtime + time[y]});
            }
        }
        return ans;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/802144.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TBOX相关芯片学习

芯片学习 ESIM–嵌入式SIM卡 ESIM将SIM卡直接嵌入到目标设备芯片&#xff0c;而不是作为独立的可移除文件 功能架构&#xff1a; SM-SR:签约管理安全路由服务器&#xff0c;主要功能是实现eUICC远程配置数据的安全路由和传输 SM-DP:签约管理数据准备服务器&#xff0c;主要功…

【产品经理】高阶产品如何处理需求?(3方法论+2案例+1清单)

不管你是萌新小白&#xff0c;还是工作了几年的“老油条”&#xff0c;需求一直是产品经理工作的重点。只不过&#xff0c;不同年限的产品经理需要面对的需求大有不同&#xff0c;对能力的要求更高。 不知你是否遇过以下问题&#xff1f; 你接手一个项目后&#xff0c;不知从何…

SDN系统方法 | 8. 网络虚拟化

随着互联网和数据中心流量的爆炸式增长&#xff0c;SDN已经逐步取代静态路由交换设备成为构建网络的主流方式&#xff0c;本系列是免费电子书《Software-Defined Networks: A Systems Approach》的中文版&#xff0c;完整介绍了SDN的概念、原理、架构和实现方式。原文: Softwar…

【软件测试】如何设计测试用例?

文章目录 1.设计测试用例的万能公式2.测试用例的具体设计方法2.1 等价类2.2 边界值2.3 判定表(因果图)2.4 场景设计法2.5 正交法2.6 错误猜测法 3.总结 1.设计测试用例的万能公式 设计测试用例的万能公式: 功能测试性能测试界面测试兼容性测试易用性测试安全测试 功能测试:验证…

ORB-SLAM3 数据集配置与评价

ORB-SLAM3运行EuRoC和TUM-VI数据集。EuRoC利用微型飞行器(MAV ) 收集的视觉惯性数据集&#xff0c;TUM-VI 是由实验人员手持视觉-惯性传感器收集的数据集。这两个是在视觉SLAM中比较常用的数据集&#xff0c;所以测试并加以记录。 文章目录 一、EuRoC数据集测试1、官网下载2、…

AtcoderABC230场

A - AtCoder Quiz 3A - AtCoder Quiz 3 题目大意 给定一个整数N&#xff0c;以AGCXXX的格式打印第N次AGC的名称&#xff0c;其中XXX是以零填充的3位数字。 思路分析 根据题目要求&#xff0c;当N≥42时&#xff0c;输出AGC加上N1&#xff0c;并补齐为3位数字的格式&#xff…

作为一名程序员,IVX你值得拥有

目录 一、IVX是什么 二、IVX编程盒子——低代码平台的首个硬件产品 iVX做硬件的原因 iVX自身特点——安全、方便、高效、低耗 三、IVX编程盒子自带的Demo系统 1. 问题反馈、在线沟通和工单处理系统 2. 大屏幕监管平台 四、IVX和其他代码平台的区别 五、低代码未来的发展…

企业知识文档管理+群晖nas安全云存储

企业知识管理系统&#xff0c;利用软件系统或其他工具的企业管理方法&#xff0c;利用软件系统或其他工具&#xff0c;对组织中大量的有价值的方案、策划、成果、经验等知识进行分类存储和管理&#xff0c;积累知识资产避免流失&#xff0c;促进知识的学习、共享、培训、再利用…

配对卡方分析

一、案例介绍 某医院用两种不同方法对53例肺癌患者进行诊断&#xff0c;收集到结果如下表&#xff0c;现在想知道两种方法的检测结果有无差别。 二、问题分析 本案例分析的目的是比较两种方法对同一批样本的检测结果有无差别&#xff0c;且检测结果为二分类变量&#xff08;阳…

确保API安全的5个推荐措施

如今社会随着互联网应用领域愈发宽广&#xff0c;我们对应用程序编程接口 (API) 的依赖也越来越巨大。因为当我们开发应用程序时&#xff0c;API可以无缝、流畅且无形地在幕后完成各种任务&#xff0c;比如从您自己的应用程序时向另一个应用程序中提取您请求的数据。它们是我们…

问题记录::

一、编码器报7382错误&#xff01;&#xff01;&#xff01; 注&#xff1a;不是机器有问题&#xff0c;是默认参数中的编码器复位是没有使能的&#xff01;&#xff01;&#xff01; 解决步骤&#xff1a;1、打开科伺驱动软件&#xff1b;一级登录&#xff1b;连接驱动&…

交换基础-VLAN、TRUNK、VTP(红茶三杯CCNA)

交换机主要功能&#xff1a;学习地址&#xff08;从源端口学习地址&#xff0c;被动学习&#xff09;、转发过滤帧、避免环路 MAC地址&#xff1a;48位&#xff0c;全球唯一&#xff0c;前24为组织标识 VLAN分类&#xff1a; 1. Static&#xff08;静态&#xff09;VLAN&…

零基础渗透测试全程记录(打靶)——Lampiao

一、打靶总流程 1.确定目标&#xff1a; 在本靶场中&#xff0c;确定目标就是使用nmap进行ip扫描&#xff0c;确定ip即为目标&#xff0c;只是针对此靶场而言。其他实战中确定目标的方式包括nmap进行扫描&#xff0c;但不局限于这个nmap。 2.信息收集&#xff1a; 比如平常挖…

路由选择原理-静态路由(红茶三杯CCNA)

路由协议&#xff1a; 被动路由协议&#xff1a;用来在路由器之间传递用户的信息 主动路由协议&#xff1a;用于维护路由器的路由表 路由的来源&#xff1a; 直连路由C&#xff1a;直接连到路由器上的网络 静态路由S&#xff1a;管理员手工构建路由表 动态路由&#xff1a;路由…

APP开发入门:了解主流的编程语言

在过去的几年里&#xff0c;有许多程序员开始学习和使用编程语言。这其中包括C、C、 Java和 Python。尽管有许多语言可供选择&#xff0c;但大多数程序员都会选择最容易学习的编程语言。 如今&#xff0c;有很多编程语言供选择。程序员们在学习这些语言时可以自由地选择他们喜…

币安SDK实时架构

在对接币安的SDK时&#xff0c;虽然可以根据文档获取行情、管理订单&#xff0c;但是还是了解人家SDK的底层逻辑比较好。 Binance通过WebSocket实时推送行情、订单数据&#xff0c;这也是大多数交易所的通用方式&#xff0c;这里展示的是币安WSS架构。有缘者得之。 Binance W…

小爱音箱播放局域网NAS上的音乐(httpRandomMusic)

小爱音箱播放局域网NAS上的音乐&#xff08;httpRandomMusic&#xff09; 手上有一个小爱音箱Pro&#xff0c;拿来给小朋友玩&#xff0c;顺带查下天气&#xff0c;控制下家里电视、空调等家电&#xff0c;一直使用挺方便的。老早以前听歌都是百度一首首下载&#xff0c;然后放…

Psim 2022仿真软件的安装--Psim电力仿真实战教程

文章目录 Psim 2022 仿真软件安装及使用教程软件介绍1.下载psim 2022安装软件&#xff0c;有需要的亲请联系作者。2.点击安装文件3.点击进行安装&#xff1a;4.安装完成&#xff0c;打开软件&#xff0c;开始仿真5.仿真模型介绍5.1.单相全控整流电路仿真5.2 三相PFC可控整流电路…

【大虾送书第四期】《Python之光:Python编程入门与实战》

目录 ✨写在前面 ✨本书亮点 ✨强力推荐 ✨文末福利 &#x1f990;博客主页&#xff1a;大虾好吃吗的博客 &#x1f990;专栏地址&#xff1a;免费送书活动专栏地址 写在前面 作为一种极其流行的编程语言&#xff0c;Python已经成为了当今最为重要的生产力工具之一。无论小学生…