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.

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

Visualization

Tap to expand
Course Schedule IV - DFS Approach INPUT Course Dependency Graph 1 0 prereq numCourses = 2 prerequisites = [[1,0]] (Course 1 before Course 0) Queries: [0, 1] Is 0 prereq of 1? [1, 0] Is 1 prereq of 0? ALGORITHM STEPS 1 Build Adjacency List adj[1] = [0] 2 Create Reachability Matrix reach[i][j] = can i reach j? 3 DFS from Each Node Mark all reachable nodes DFS from node 1: 1 0 reach[1][0]=true 4 Answer Queries Lookup reach[a][b] for each Matrix 0 1 0[F, F] 1[T, F] FINAL RESULT Query [0, 1] Is course 0 a prereq of 1? false Query [1, 0] Is course 1 a prereq of 0? true Output Array: [false, true] OK - Both queries answered! Time: O(V+E), Space: O(V^2) Key Insight: DFS explores all reachable nodes from each course, building a transitive closure matrix. This precomputation allows O(1) query answering. Course A is a prerequisite of B if there exists any path from A to B in the directed graph (direct or through intermediate courses). TutorialsPoint - Course Schedule IV | DFS Approach
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