Leetcode 1558 Solution

This article provides solution to leetcode question 1558 (course-schedule-iv)

https://leetcode.com/problems/course-schedule-iv

Solution

class Solution:
    def checkIfPrerequisite(self, numCourses: int, prerequisites: List[List[int]], queries: List[List[int]]) -> List[bool]:
        graph = prerequisites

        child_nodes = collections.defaultdict(set)
        parent_nodes = collections.defaultdict(set)
        nodes = set()

        for src, dst in graph:
            nodes.add(src)
            nodes.add(dst)
            child_nodes[src].add(dst)
            parent_nodes[dst].add(src)

        q = collections.deque()
        for node in nodes:
            if len(parent_nodes[node]) == 0:
                q.append(node)

        ancestors = collections.defaultdict(set)

        while q:
            node = q.popleft()

            for child_node in child_nodes[node]:
                ancestors[child_node] |= ancestors[node] | {node}

                parent_nodes[child_node].remove(node)
                if len(parent_nodes[child_node]) == 0:
                    q.append(child_node)

        ans = []
        for src, dst in queries:
            ans.append(src in ancestors[dst])

        return ans