Imagine you're planning your college course schedule! šŸŽ“ You have numCourses courses numbered from 0 to numCourses - 1, and some courses have prerequisites that must be completed first.

You're given an array prerequisites where prerequisites[i] = [ai, bi] means you must complete course ai before taking course bi. For example, [0, 1] means course 0 is required before course 1.

Here's the tricky part: Prerequisites can be indirect! If course A is required for course B, and course B is required for course C, then course A is also required for course C (transitivity).

You need to answer multiple queries where each query [u, v] asks: "Is course u a prerequisite of course v?"

Goal: Return a boolean array where each element answers the corresponding query efficiently.

Input & Output

example_1.py — Basic Prerequisites
$ Input: numCourses = 2, prerequisites = [[1,0]], queries = [[0,1],[1,0]]
› Output: [false, true]
šŸ’” Note: Course 1 is a prerequisite of course 0, but course 0 is not a prerequisite of course 1. So [0,1] returns false and [1,0] returns true.
example_2.py — Transitive Prerequisites
$ Input: numCourses = 3, prerequisites = [[1,2],[1,0],[2,0]], queries = [[1,0],[1,2]]
› Output: [true, true]
šŸ’” Note: Course 1 is directly a prerequisite of both courses 0 and 2. The transitive relationship 1→2→0 also makes 1 a prerequisite of 0.
example_3.py — No Prerequisites
$ Input: numCourses = 3, prerequisites = [], queries = [[0,1],[1,2],[2,0]]
› Output: [false, false, false]
šŸ’” Note: No prerequisites are given, so no course is a prerequisite of any other course. All queries return false.

Visualization

Tap to expand
Course Schedule Prerequisite GraphMathPhysEngCSAILegend:Direct prerequisiteTransitive prerequisiteQuery Examples:• Is Math prerequisite of AI? → True• Is Physics prerequisite of CS? → False
Understanding the Visualization
1
Model as Graph
Each course is a node, prerequisites are directed edges
2
Find Transitive Closure
Use Floyd-Warshall to find all indirect prerequisite relationships
3
Answer Queries
Look up precomputed relationships in constant time
Key Takeaway
šŸŽÆ Key Insight: By precomputing all transitive relationships using Floyd-Warshall, we transform multiple expensive graph traversals into simple matrix lookups, achieving optimal performance for multiple queries.

Time & Space Complexity

Time Complexity
ā±ļø
O(V³ + Q)

O(V³) for Floyd-Warshall preprocessing plus O(1) per query

n
2n
āœ“ Linear Growth
Space Complexity
O(V²)

2D matrix to store all pairwise reachability relationships

n
2n
āœ“ Linear Space

Constraints

  • 2 ≤ numCourses ≤ 100
  • 0 ≤ prerequisites.length ≤ (numCourses * (numCourses - 1) / 2)
  • prerequisites[i].length == 2
  • 0 ≤ ai, bi ≤ numCourses - 1
  • ai ≠ bi
  • All the pairs [ai, bi] are unique
  • The prerequisites graph has no cycles
  • 1 ≤ queries.length ≤ 104
  • 0 ≤ uj, vj ≤ numCourses - 1
  • uj ≠ vj
Asked in
Google 42 Amazon 38 Meta 29 Microsoft 25
28.4K Views
Medium Frequency
~18 min Avg. Time
985 Likes
Ln 1, Col 1
Smart Actions
šŸ’” Explanation
AI Ready
šŸ’” Suggestion Tab to accept Esc to dismiss
// Output will appear here after running code
Code Editor Closed
Click the red button to reopen