【每日一题Day324】LC1462课程表 IV | BFS 拓扑排序 Floyd

简介: 【每日一题Day324】LC1462课程表 IV | BFS 拓扑排序 Floyd

课程表 IV【LC1462】

你总共需要上 numCourses 门课,课程编号依次为 0numCourses-1 。你会得到一个数组 prerequisite ,其中 prerequisites[i] = [ai, bi] 表示如果你想选 bi 课程,你 必须 先选 ai 课程。

  • 有的课会有直接的先修课程,比如如果想上课程 1 ,你必须先上课程 0 ,那么会以 [0,1] 数对的形式给出先修课程数对。

先决条件也可以是 间接 的。如果课程 a 是课程 b 的先决条件,课程 b 是课程 c 的先决条件,那么课程 a 就是课程 c 的先决条件。

你也得到一个数组 queries ,其中 queries[j] = [uj, vj]。对于第 j 个查询,您应该回答课程 uj 是否是课程 vj 的先决条件。

返回一个布尔数组 answer ,其中 answer[j] 是第 j 个查询的答案。

暴力

class Solution {
    public List<Boolean> checkIfPrerequisite(int n, int[][] prerequisites, int[][] queries) {
        // 枚举+BFS
        List<Integer>[] g = new List[n];
        Arrays.setAll(g, e -> new ArrayList<>());
        List<Boolean> res = new ArrayList<>();
        for (int[] pre : prerequisites){
            int u = pre[0], v = pre[1];
            g[u].add(v);// v的先决条件是u
        }
        for (int[] q : queries){
            int u = q[0], v = q[1];
            Deque<Integer> queue = new LinkedList<>();
            boolean[] vis = new boolean[n];
            queue.addLast(u);
            vis[u] = true;
            boolean find = false;
            while(!queue.isEmpty()){
                int node = queue.pollFirst();
                if (node == v){
                    find = true;
                    break;
                }
                for (int next : g[node]){                   
                    if (!vis[next]){
                        queue.addLast(next);
                        vis[next] = true;
                    }
                }
            }
            res.add(find);
        }
        return res;
    }
}

image.png

枚举k ,并枚举u 和v ,如果u 是k 的先决条件并且k是v 的先决条件,那么u 是v 的先决条件


实现

class Solution {
    public List<Boolean> checkIfPrerequisite(int n, int[][] prerequisites, int[][] queries) {
        List<Boolean> res = new ArrayList<>();
        boolean[][] f = new boolean[n][n];// f[i][j]代表i是否是j的先决条件
        for (int[] pre : prerequisites){
            int u = pre[0], v = pre[1];
            f[u][v] = true;
        }
        for (int k = 0; k < n; k++){
            for (int u = 0; u < n; u++){
                for (int v = 0; v < n; v++){
                    f[u][v] |= f[u][k] && f[k][v];
                }
            }
        }
        for (int[] q : queries){
            int u = q[0], v = q[1];   
            res.add(f[u][v]);
        }
        return res;
    }
}

image.png

class Solution {
    public List<Boolean> checkIfPrerequisite(int n, int[][] prerequisites, int[][] queries) {
        // 拓扑排序
        List<Integer>[] g = new List[n];
        int[] inDeg = new int[n];
        Arrays.setAll(g, e -> new ArrayList<>());
        List<Boolean> res = new ArrayList<>();
        boolean[][] f = new boolean[n][n];// f[i][j]代表i是否是j的先决条件
        for (int[] pre : prerequisites){
            int u = pre[0], v = pre[1];
            g[u].add(v);
            inDeg[v]++;
        }
        Deque<Integer> queue = new LinkedList<>();
        for (int i = 0; i < n; i++){
            if (inDeg[i] == 0){
                queue.addLast(i);
            }
        }
        while (!queue.isEmpty()){
            int u = queue.pollFirst();
            for (int v : g[u]){
                f[u][v] = true;
                for (int k = 0; k < n; k++){
                    f[k][v] |= f[k][u];//k -> u -> v 
                }
                if(--inDeg[v] == 0){
                    queue.addLast(v);
                }
            }
        }
        for (int[] q : queries){
            int u = q[0], v = q[1];   
            res.add(f[u][v]);
        }
        return res;
    }
}

image.png

目录
相关文章
|
7月前
【每日一题Day266】LC18四数之和 | 排序+双指针
【每日一题Day266】LC18四数之和 | 排序+双指针
44 1
|
7月前
【每日一题Day331】LC2560打家劫舍 IV | 二分查找 + 贪心
【每日一题Day331】LC2560打家劫舍 IV | 二分查找 + 贪心
47 0
|
7月前
|
人工智能 BI
【每日一题Day267】LC834树中距离之和 | 换根dp
【每日一题Day267】LC834树中距离之和 | 换根dp
50 0
华为机试HJ44:Sudoku(数独问题,深度优先遍历DFS解法)
华为机试HJ44:Sudoku(数独问题,深度优先遍历DFS解法)
150 0
|
7月前
|
定位技术
【每日一题Day200】LC1263推箱子 | 01-BFS
【每日一题Day200】LC1263推箱子 | 01-BFS
45 1
|
7月前
|
机器学习/深度学习 存储
【每日一题Day323】LC630课程表 III | 动态规划 反悔贪心
【每日一题Day323】LC630课程表 III | 动态规划 反悔贪心
47 0
|
7月前
|
人工智能 BI
【每日一题Day321】LC207课程表 | 拓扑排序
【每日一题Day321】LC207课程表 | 拓扑排序
43 0
|
7月前
|
人工智能 BI
【每日一题Day322】LC210课程表 II | 拓扑排序
【每日一题Day322】LC210课程表 II | 拓扑排序
37 0
|
7月前
【每日一题Day328】LC198打家劫舍 | 动态规划
【每日一题Day328】LC198打家劫舍 | 动态规划
55 0
|
7月前
【每日一题Day218】LC1091 二进制矩阵中的最短路径 | BFS
【每日一题Day218】LC1091 二进制矩阵中的最短路径 | BFS
38 0