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())
相关推荐
君义_noip24 分钟前
信息学奥赛一本通 1524:旅游航道
c++·算法·图论·信息学奥赛
YYJ333_33330 分钟前
蓝桥杯训练士兵
职场和发展·蓝桥杯
烁34733 分钟前
每日一题(小白)动态规划篇5
算法·动态规划
独好紫罗兰34 分钟前
洛谷题单2-P5717 【深基3.习8】三角形分类-python-流程图重构
开发语言·python·算法
滴答滴答嗒嗒滴40 分钟前
Python小练习系列 Vol.8:组合总和(回溯 + 剪枝 + 去重)
python·算法·剪枝
lidashent1 小时前
数据结构和算法——汉诺塔问题
数据结构·算法
Tom Boom1 小时前
【3. 软件工程】3.1 软件过程模型
职场和发展·系统架构·软件工程
小王努力学编程1 小时前
动态规划学习——背包问题
开发语言·c++·学习·算法·动态规划
f狐0狸x3 小时前
【蓝桥杯每日一题】4.1
c语言·c++·算法·蓝桥杯
ん贤3 小时前
2023第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组(真题&题解)(C++/Java题解)
java·c语言·数据结构·c++·算法·蓝桥杯