Course Schedule IV

medium graph dp topological sort

Problem

n courses 0..n-1 and prerequisites edges a→b. Answer each query (u, v): is u a prerequisite of v (directly or transitively)?

Inputn=3, prerequisites=[[1,2],[1,0],[2,0]], queries=[[1,0],[1,2]]
Output[true,true]
Both are directly listed; transitive reach handles indirect cases.

def check_if_prerequisite(n, prerequisites, queries):
    reach = [[False]*n for _ in range(n)]
    for a, b in prerequisites: reach[a][b] = True
    for k in range(n):
        for i in range(n):
            for j in range(n):
                if reach[i][k] and reach[k][j]: reach[i][j] = True
    return [reach[u][v] for u, v in queries]
function checkIfPrerequisite(n, prerequisites, queries) {
  const reach = Array.from({length: n}, () => new Array(n).fill(false));
  for (const [a, b] of prerequisites) reach[a][b] = true;
  for (let k = 0; k < n; k++) for (let i = 0; i < n; i++) for (let j = 0; j < n; j++)
    if (reach[i][k] && reach[k][j]) reach[i][j] = true;
  return queries.map(([u, v]) => reach[u][v]);
}
class Solution {
    public List checkIfPrerequisite(int n, int[][] pr, int[][] q) {
        boolean[][] r = new boolean[n][n];
        for (int[] e : pr) r[e[0]][e[1]] = true;
        for (int k = 0; k < n; k++) for (int i = 0; i < n; i++) for (int j = 0; j < n; j++)
            if (r[i][k] && r[k][j]) r[i][j] = true;
        List ans = new ArrayList<>();
        for (int[] x : q) ans.add(r[x[0]][x[1]]);
        return ans;
    }
}
vector checkIfPrerequisite(int n, vector>& pr, vector>& q) {
    vector> r(n, vector(n, false));
    for (auto& e : pr) r[e[0]][e[1]] = true;
    for (int k = 0; k < n; k++) for (int i = 0; i < n; i++) for (int j = 0; j < n; j++)
        if (r[i][k] && r[k][j]) r[i][j] = true;
    vector a;
    for (auto& x : q) a.push_back(r[x[0]][x[1]]);
    return a;
}
Time: O(n^3) Space: O(n^2)