Kahn's with earliest start
Time O(n + E) Space O(n + E)When popping u, finish[u] = start[u] + time[u]; for each successor v, start[v] = max(start[v], finish[u]). The answer is the largest finish.
import java.util.*;
class Solution {
public int minimumTime(int n, int[][] relations, int[] time) {
List<List<Integer>> adj = new ArrayList<>();
for (int i = 0; i <= n; i++) adj.add(new ArrayList<>());
int[] indeg = new int[n + 1], start = new int[n + 1];
for (int[] r : relations) { adj.get(r[0]).add(r[1]); indeg[r[1]]++; }
Deque<Integer> q = new ArrayDeque<>();
for (int i = 1; i <= n; i++) if (indeg[i] == 0) q.offer(i);
int best = 0;
while (!q.isEmpty()) {
int u = q.poll();
int finish = start[u] + time[u - 1];
best = Math.max(best, finish);
for (int v : adj.get(u)) {
start[v] = Math.max(start[v], finish);
if (--indeg[v] == 0) q.offer(v);
}
}
return best;
}
}Verdict: The critical path method from project management.