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())
相关推荐
风中的微尘6 小时前
39.网络流入门
开发语言·网络·c++·算法
西红柿维生素6 小时前
JVM相关总结
java·jvm·算法
ChillJavaGuy8 小时前
常见限流算法详解与对比
java·算法·限流算法
sali-tec8 小时前
C# 基于halcon的视觉工作流-章34-环状测量
开发语言·图像处理·算法·计算机视觉·c#
你怎么知道我是队长10 小时前
C语言---循环结构
c语言·开发语言·算法
艾醒10 小时前
大模型面试题剖析:RAG中的文本分割策略
人工智能·算法
纪元A梦12 小时前
贪心算法应用:K-Means++初始化详解
算法·贪心算法·kmeans
_不会dp不改名_12 小时前
leetcode_21 合并两个有序链表
算法·leetcode·链表
mark-puls12 小时前
C语言打印爱心
c语言·开发语言·算法
Python技术极客12 小时前
将 Python 应用打包成 exe 软件,仅需一行代码搞定!
算法