2050. Parallel Courses III
Tags:
Use an array to record time.
class Solution:
    def minimumTime(self, n: int, relations: List[List[int]], time: List[int]) -> int:
        time = [0] + time
        M = defaultdict(list)
        indeg = [0] * (n+1)
        pre = [0] * (n+1)
        for v1, v2 in relations:
            M[v1].append(v2)
            indeg[v2] += 1
        dq = deque([i for i in range(1, n+1) if indeg[i] == 0])
        res = 0
        while dq:
            lens = len(dq)
            for _ in range(lens):
                v = dq.popleft()
                for vv in M[v]:
                    pre[vv] = max(pre[vv], time[v])
                    indeg[vv] -= 1
                    if not indeg[vv]:
                        dq.append(vv)
                        time[vv] += pre[vv]
        return max(time)