目录

leetcode - 2050. Parallel Courses III

Description

You are given an integer n, which indicates that there are n courses labeled from 1 to n. You are also given a 2D integer array relations where relations[j] = [prevCoursej, nextCoursej] denotes that course prevCoursej has to be completed before course nextCoursej (prerequisite relationship). Furthermore, you are given a 0-indexed integer array time where time[i] denotes how many months it takes to complete the (i+1)th course.

You must find the minimum number of months needed to complete all the courses following these rules:

You may start taking a course at any time if the prerequisites are met.

Any number of courses can be taken at the same time.

Return the minimum number of months needed to complete all the courses.

Note: The test cases are generated such that it is possible to complete every course (i.e., the graph is a directed acyclic graph).

Example 1:

复制代码
Input: n = 3, relations = [[1,3],[2,3]], time = [3,2,5]
Output: 8
Explanation: The figure above represents the given graph and the time required to complete each course. 
We start course 1 and course 2 simultaneously at month 0.
Course 1 takes 3 months and course 2 takes 2 months to complete respectively.
Thus, the earliest time we can start course 3 is at month 3, and the total time required is 3 + 5 = 8 months.

Example 2:

复制代码
Input: n = 5, relations = [[1,5],[2,5],[3,5],[3,4],[4,5]], time = [1,2,3,4,5]
Output: 12
Explanation: The figure above represents the given graph and the time required to complete each course.
You can start courses 1, 2, and 3 at month 0.
You can complete them after 1, 2, and 3 months respectively.
Course 4 can be taken only after course 3 is completed, i.e., after 3 months. It is completed after 3 + 4 = 7 months.
Course 5 can be taken only after courses 1, 2, 3, and 4 have been completed, i.e., after max(1,2,3,7) = 7 months.
Thus, the minimum time needed to complete all the courses is 7 + 5 = 12 months.

Constraints:

复制代码
1 <= n <= 5 * 10^4
0 <= relations.length <= min(n * (n - 1) / 2, 5 * 10^4)
relations[j].length == 2
1 <= prevCoursej, nextCoursej <= n
prevCoursej != nextCoursej
All the pairs [prevCoursej, nextCoursej] are unique.
time.length == n
1 <= time[i] <= 10^4
The given graph is a directed acyclic graph.

Solution

Topological sort + bfs, keep track of all the parent nodes and children nodes, use a queue to visit all the nodes, make sure the time in queue is the largest time we have at that time.

Time complexity: o ( n ) o(n) o(n)

Space complexity: o ( 1 ) o(1) o(1)

Code

python3 复制代码
class Solution:
    def minimumTime(self, n: int, relations: List[List[int]], time: List[int]) -> int:
        def build_graph(n: int, edges: list):
            graph = {i: {'p': [], 'c': []} for i in range(n)}
            indegree = {i: 0 for i in range(n)}
            for start, end in edges:
                graph[end - 1]['p'].append(start - 1)
                graph[start - 1]['c'].append(end - 1)
                indegree[end - 1] += 1
            return graph, indegree
        
        graph, indegree = build_graph(n, relations)
        time_memo = {i: 0 for i in range(n)}
        queue = collections.deque([])
        for i in range(n):
            if indegree[i] == 0:
                queue.append((i, 0))
        while queue:
            node, finish_time = queue.popleft()
            if time_memo[node] > finish_time + time[node]:
                continue
            time_memo[node] = finish_time + time[node]
            for next_node in graph[node]['c']:
                indegree[next_node] -= 1
                if indegree[next_node] == 0:
                    parent_time = 0
                    for each_parent in graph[next_node]['p']:
                        parent_time = max(parent_time, time_memo[each_parent])
                    queue.append((next_node, parent_time))
        return max(time_memo.values())
本文是转载文章,点击查看原文
如有侵权,请联系 xyy@jishuzhan.net 删除
相关推荐
黄油烤菠萝4 分钟前
蓝桥杯-卡java排序
c++·算法·蓝桥杯
不要天天开心7 分钟前
Scala集合
图像处理·算法·机器学习·scala
uhakadotcom23 分钟前
Google Cloud Dataproc:简化大数据处理的强大工具
后端·算法·面试
uhakadotcom1 小时前
PyTorch 分布式训练入门指南
算法·面试·github
uhakadotcom1 小时前
PyTorch 与 Amazon SageMaker 配合使用:基础知识与实践
算法·面试·github
uhakadotcom1 小时前
在Google Cloud上使用PyTorch:如何在Vertex AI上训练和调优PyTorch模型
算法·面试·github
wen__xvn2 小时前
c++STL入门
开发语言·c++·算法
weisian1514 小时前
力扣经典算法篇-9-跳跃游戏(贪心算法,反向递推)
算法·leetcode·游戏
MCYH02064 小时前
C++抽卡模拟器
java·c++·算法·概率·原神
pystraf4 小时前
P10587 「ALFR Round 2」C 小 Y 的数 Solution
数据结构·c++·算法·线段树·洛谷