IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 拓扑排序—并行课程 III(leetcode 5909) -> 正文阅读

[数据结构与算法]拓扑排序—并行课程 III(leetcode 5909)

题目描述

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

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

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

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

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

示例 1:

输入: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:

输入: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
??? 先修课程图是一个有向无环图。

问题分析

定义 cost[i] 为到达 i 节点花费的最长月份,则:

????? cost[i] = max(cost[i], cost[pre]+nums[i])

即 cost[i]是由 i 节点的所有前置节点 + i节点的cost,

取其中最大的,即:

遇到cost[pre] + nums[i]大于当前 cost[i], 则更新cost[i]

代码

class Solution {
public:
    int minimumTime(int n, vector<vector<int>>& relations, vector<int>& time) {
        vector<int> in(n);
        vector<vector<int>> edges(n);
        queue<int> que;
        vector<int> dp(n, INT_MIN);
        int ans = INT_MIN;
        for(auto& term : relations) {
            edges[term[0]-1].push_back(term[1]-1);
            in[term[1]-1]++;
        }

        for(int i = 0; i < n; ++i) {
            if(in[i] == 0) {
                que.push(i);
                dp[i] = time[i]; // 没有pre节点,i节点的cost等于自身cost
                ans = max(ans, dp[i]);
            }
        }

        while(!que.empty()) {
            auto pre = que.front();
            que.pop();

            for(auto& cur_node: edges[pre]) {
                in[cur_node]--;
                if(in[cur_node] == 0) { //没有前置节点,加入队列
                    que.push(cur_node);
                }
                dp[cur_node] = max(dp[cur_node], dp[pre] + time[cur_node]); //当前节点的cost 等于 所有到当前节点的节点的cost + 当前节点的cost,取最大的
                ans = max(ans, dp[cur_node]);
            }
        }
        return ans;
    }
};

复杂度分析

时间复杂度:O(n+m)

空间复杂度:O (n+m)

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-25 12:43:47  更:2021-10-25 12:46:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 8:52:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码