BFS level by level. Count levels as semesters.
function minimumSemesters(n, relations): graph = [[] for _ in range(n + 1)] inDegree = [0] * (n + 1) for a, b in relations: graph[b].append(a) inDegree[a] += 1 queue = [i for i in range(1, n + 1) if inDegree[i] == 0] semesters = 0 completed = 0 while queue: semesters += 1 nextQueue = [] for course in queue: completed += 1 for neighbor in graph[course]: inDegree[neighbor] -= 1 if inDegree[neighbor] == 0: nextQueue.append(neighbor) queue = nextQueue return semesters if completed == n else -1
time and space.