class Solution:
def minimumSemesters(self, n: int, relations: List[List[int]]) -> int:
if not relations:
return -1
table = defaultdict(list)
for prevCourse, nextCourse in relations:
table[prevCourse].append(nextCourse)
visited = {}
def hasCycle(currentCourse: int) -> bool:
if currentCourse in visited:
return visited[currentCourse]
visited[currentCourse] = True
for course in table[currentCourse]:
if backtrack(course):
return True
visited[currentCourse] = False
return visited[currentCourse]
for i in range(n):
if hasCycle(i):
return -1
# TODO
class Solution:
def minimumSemesters(self, n: int, relations: List[List[int]]) -> int:
graph = {i: [] for i in range(1, n + 1)}
indegree = {i: 0 for i in range(1, n + 1)}
for prevCourse, nextCourse in relations:
graph[prevCourse].append(nextCourse)
indegree[nextCourse] += 1
queue = deque([])
for node in graph:
if indegree[node] == 0:
queue.append(node)
step = 0
studied = 0
while queue:
step += 1
size = len(queue)
for i in range(size):
node = queue.popleft()
studied += 1
for child in graph[node]:
indegree[child] -= 1
if indegree[child] == 0:
queue.append(child)
return step if studied == n else -1