Course Schedule 4
MediumUpdated: Aug 2, 2025
Practice on:
Problem
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.
- For example, the pair
[0, 1]indicates that you have to take course0before you can take course1.
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.
Examples
Example 1:
graph LR; 1 --> 0
Input: numCourses = 2, prerequisites = [[1,0]], queries = [[0,1],[1,0]]
Output: [false,true]
Explanation: The pair [1, 0] indicates that you have to take course 1 before you can take course 0.
Course 0 is not a prerequisite of course 1, but the opposite is true.
Example 2:
Input: numCourses = 2, prerequisites = [], queries = [[1,0],[0,1]]
Output: [false,false]
Explanation: There are no prerequisites, and each course is independent.
Example 3:
graph LR; 1 --> 0 1 --> 2 2 --> 0
Input: numCourses = 3, prerequisites = [[1,2],[1,0],[2,0]], queries = [[1,0],[1,2]]
Output: [true,true]
Constraints:
2 <= numCourses <= 1000 <= prerequisites.length <= (numCourses * (numCourses - 1) / 2)prerequisites[i].length == 20 <= ai, bi <= numCourses - 1ai != bi- All the pairs
[ai, bi]are unique. - The prerequisites graph has no cycles.
1 <= queries.length <= 1040 <= ui, vi <= numCourses - 1ui != vi
Solution
Method 1 - Floyd Warshall Algorithm
Here is the approach:
- Graph Representation: Represent the courses and their prerequisites as a directed graph where an edge from node
ato nodeb(a -> b) means courseais a prerequisite for courseb. - Prerequisite Checking: To check if a course is a prerequisite of another, use the Floyd-Warshall algorithm which computes the transitive closure of the graph. The result of this algorithm can answer any query about the prerequisites between courses.
- Algorithm:
- Create a matrix
reachablewherereachable[i][j]isTrueif courseiis a prerequisite of coursej. - Initialize the matrix: set
reachable[a][b]toTruefor every prerequisite pair[a, b]. - Use the Floyd-Warshall algorithm to compute the transitive closure, updating
reachable[i][j]toTrueif there exists a courseksuch thatreachable[i][k]andreachable[k][j]are bothTrue. - For each query
[u, v], check the value ofreachable[u][v]to determine ifuis a prerequisite ofv.
- Create a matrix
Code
Java
class Solution {
public List<Boolean> checkIfPrerequisite(int numCourses, int[][] prerequisites, int[][] queries) {
boolean[][] reachable = new boolean[numCourses][numCourses];
for (int[] pre : prerequisites) {
reachable[pre[0]][pre[1]] = true;
}
for (int k = 0; k < numCourses; k++) {
for (int i = 0; i < numCourses; i++) {
for (int j = 0; j < numCourses; j++) {
if (reachable[i][k] && reachable[k][j]) {
reachable[i][j] = true;
}
}
}
}
List<Boolean> ans = new ArrayList<>();
for (int[] query : queries) {
ans.add(reachable[query[0]][query[1]]);
}
return ans;
}
}
Python
class Solution:
def checkIfPrerequisite(self, numCourses: int, prerequisites: List[Tuple[int, int]], queries: List[Tuple[int, int]]) -> List[bool]:
reachable = [[False] * numCourses for _ in range(numCourses)]
for pre in prerequisites:
reachable[pre[0]][pre[1]] = True
for k in range(numCourses):
for i in range(numCourses):
for j in range(numCourses):
if reachable[i][k] and reachable[k][j]:
reachable[i][j] = True
ans: List[bool] = []
for u, v in queries:
ans.append(reachable[u][v])
return ans
Complexity
- ⏰ Time complexity:
O(n^2 + q), wheren = numCoursesandq = number of queries.- Initializing and updating the
reachablematrix with Floyd-Warshall takes O(n³). - Answering all queries takes O(q).
- Initializing and updating the
- 🧺 Space complexity:
O(n^2), for thereachablematrix storing prerequisite relationships between all pairs of courses.