
Solution: BFS

class Solution {
public int minimumTime(int n, int[][] relations, int[] time) {
int[] inDegree = new int[n + 1];
int[] maxTimeToNode = new int[n + 1];
Map<Integer, List<Integer>> graph = new HashMap<>();
for (int i = 1; i <= n; i++) {
graph.put(i, new ArrayList<>());
}
for (int[] r : relations) {
inDegree[r[1]]++;
graph.get(r[0]).add(r[1]);
}
Queue<Integer> queue = new LinkedList<>();
for (int i = 1; i <= n; i++) {
if (inDegree[i] == 0) {
queue.offer(i);
}
maxTimeToNode[i] = time[i - 1];
}
while (!queue.isEmpty()) {
int curCourse = queue.poll();
for (int adj : graph.get(curCourse)) {
inDegree[adj]--;
if (inDegree[adj] == 0) {
queue.offer(adj);
}
maxTimeToNode[adj] = Math.max(maxTimeToNode[adj], time[adj - 1] + maxTimeToNode[curCourse]);
}
}
int res = 0;
for (int t : maxTimeToNode) {
res = Math.max(res, t);
}
return res;
}
}