There are a total of numCourses courses you have to take, labeled from 0 to numCourses - 1. You are given an array prerequisites where prerequisites[i] = [ai, bi] indicates that you must take course ai first if you want to take course bi.
[0, 1] indicates that you have to take course 0 before you can take course 1.Prerequisites can also be indirect. If course a is a prerequisite of course b, and course b is a prerequisite of course c, then course a is a prerequisite of course c.
You are also given an array queries where queries[j] = [uj, vj]. For the jth query, you should answer whether course uj is a prerequisite of course vj or not.
Return a boolean array answer, where answer[j] is the answer to the jth query.
Example 1:
Input: numCourses = 4, prerequisites = [[1,0],[2,1],[3,2]], queries = [[0,1],[3,1]]
Output: [false,true]Example 2:
Input: numCourses = 2, prerequisites = [[1,0]], queries = [[0,1]]
Output: [false]Constraints:
2 <= numCourses <= 1000 <= prerequisites.length <= (numCourses * (numCourses - 1) / 2)prerequisites[i].length == 20 <= ai, bi <= numCourses - 1ai != bi[ai, bi] are unique.1 <= queries.length <= 10,0000 <= ui, vi <= numCourses - 1ui != viclass Solution:
def checkIfPrerequisite(self, numCourses: int, prerequisites: List[List[int]], queries: List[List[int]]) -> List[bool]:
adj = [[] for _ in range(numCourses)]
for u, v in prerequisites:
adj[u].append(v)
def dfs(node, target):
if node == target:
return True
for nei in adj[node]:
if dfs(nei, target):
return True
return False
res = []
for u, v in queries:
res.append(dfs(u, v))
return resWhere is the number of queries, is the number of courses, and is the number of prerequisites.
class Solution:
def checkIfPrerequisite(self, numCourses: int, prerequisites: List[List[int]], queries: List[List[int]]) -> List[bool]:
adj = defaultdict(list)
for prereq, crs in prerequisites:
adj[crs].append(prereq)
def dfs(crs):
if crs not in prereqMap:
prereqMap[crs] = set()
for prereq in adj[crs]:
prereqMap[crs] |= dfs(prereq)
prereqMap[crs].add(crs)
return prereqMap[crs]
prereqMap = {}
for crs in range(numCourses):
dfs(crs)
res = []
for u, v in queries:
res.append(u in prereqMap[v])
return resWhere is the number of queries, is the number of courses, and is the number of prerequisites.
class Solution:
def checkIfPrerequisite(self, numCourses: int, prerequisites: List[List[int]], queries: List[List[int]]) -> List[bool]:
adj = [[] for _ in range(numCourses)]
isPrereq = [[-1] * numCourses for _ in range(numCourses)]
for prereq, crs in prerequisites:
adj[crs].append(prereq)
isPrereq[crs][prereq] = True
def dfs(crs, prereq):
if isPrereq[crs][prereq] != -1:
return isPrereq[crs][prereq] == 1
for pre in adj[crs]:
if pre == prereq or dfs(pre, prereq):
isPrereq[crs][prereq] = 1
return True
isPrereq[crs][prereq] = 0
return False
res = []
for u, v in queries:
res.append(dfs(v, u))
return resWhere is the number of queries, is the number of courses, and is the number of prerequisites.
class Solution:
def checkIfPrerequisite(self, numCourses: int, prerequisites: List[List[int]], queries: List[List[int]]) -> List[bool]:
adj = [set() for _ in range(numCourses)]
indegree = [0] * numCourses
isPrereq = [set() for _ in range(numCourses)]
for pre, crs in prerequisites:
adj[pre].add(crs)
indegree[crs] += 1
q = deque([i for i in range(numCourses) if indegree[i] == 0])
while q:
node = q.popleft()
for neighbor in adj[node]:
isPrereq[neighbor].add(node)
isPrereq[neighbor].update(isPrereq[node])
indegree[neighbor] -= 1
if indegree[neighbor] == 0:
q.append(neighbor)
return [u in isPrereq[v] for u, v in queries]Where is the number of queries, is the number of courses, and is the number of prerequisites.
class Solution:
def checkIfPrerequisite(self, numCourses: int, prerequisites: List[List[int]], queries: List[List[int]]) -> List[bool]:
res = []
adj = [[False] * numCourses for _ in range(numCourses)]
for pre, crs in prerequisites:
adj[pre][crs] = True
for k in range(numCourses):
for i in range(numCourses):
for j in range(numCourses):
adj[i][j] = adj[i][j] or (adj[i][k] and adj[k][j])
for u, v in queries:
res.append(adj[u][v])
return resWhere is the number of queries, is the number of courses, and is the number of prerequisites.