from typing import List
from collections import deque

class Solution:
    def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
        # Build adjacency list: b -> list of courses that depend on b
        adj = [[] for _ in range(numCourses)]
        # indegree[x] = number of prerequisites for course x
        indegree = [0] * numCourses

        for a, b in prerequisites:
            adj[b].append(a)
            indegree[a] += 1

        # Queue courses that currently have no prerequisites
        q = deque()
        for c in range(numCourses):
            if indegree[c] == 0:
                q.append(c)

        taken = 0  # count processed courses

        # Remove prerequisites layer by layer
        while q:
            course = q.popleft()
            taken += 1

            # Taking 'course' reduces indegree of its dependent courses
            for nxt in adj[course]:
                indegree[nxt] -= 1
                if indegree[nxt] == 0:
                    q.append(nxt)

        # If we processed all courses, no cycle exists
        return taken == numCourses