Level-order Kahn's
Time O(n + E) Space O(n + E)Queue in-degree-0 courses. Each pass over the current queue size is a semester. Count courses taken; fewer than n means a cycle.
import java.util.*;
class Solution {
public int minimumSemesters(int n, int[][] relations) {
List<List<Integer>> adj = new ArrayList<>();
for (int i = 0; i <= n; i++) adj.add(new ArrayList<>());
int[] indeg = 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 semesters = 0, taken = 0;
while (!q.isEmpty()) {
semesters++;
for (int size = q.size(); size > 0; size--) {
int u = q.poll();
taken++;
for (int v : adj.get(u)) if (--indeg[v] == 0) q.offer(v);
}
}
return taken == n ? semesters : -1;
}
}Verdict: BFS levels on a DAG.