【每日一题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

目录
相关文章
|
9月前
【每日一题Day331】LC2560打家劫舍 IV | 二分查找 + 贪心
【每日一题Day331】LC2560打家劫舍 IV | 二分查找 + 贪心
50 0
|
9月前
|
人工智能 BI
【每日一题Day267】LC834树中距离之和 | 换根dp
【每日一题Day267】LC834树中距离之和 | 换根dp
53 0
|
9月前
2560. 打家劫舍 IV(二分)
2560. 打家劫舍 IV(二分)
|
9月前
|
机器学习/深度学习
【每日一题Day271】LC918环形子数组的最大和 | 分类讨论 + dp
【每日一题Day271】LC918环形子数组的最大和 | 分类讨论 + dp
65 0
【每日一题Day271】LC918环形子数组的最大和 | 分类讨论 + dp
|
9月前
|
机器学习/深度学习 存储
【每日一题Day323】LC630课程表 III | 动态规划 反悔贪心
【每日一题Day323】LC630课程表 III | 动态规划 反悔贪心
51 0
|
9月前
|
人工智能 BI
【每日一题Day321】LC207课程表 | 拓扑排序
【每日一题Day321】LC207课程表 | 拓扑排序
45 0
|
9月前
|
人工智能 BI
【每日一题Day322】LC210课程表 II | 拓扑排序
【每日一题Day322】LC210课程表 II | 拓扑排序
42 0
|
9月前
【每日一题Day309】LC823带因子的二叉树 | dp
【每日一题Day309】LC823带因子的二叉树 | dp
45 0
|
机器学习/深度学习
【每日一题Day107】LC1145二叉树着色游戏 | dfs+贪心
现在,假设你是「二号」玩家,根据所给出的输入,假如存在一个 y 值可以确保你赢得这场游戏,则返回 true ;若无法获胜,就请返回 false 。
109 0
【每日一题Day107】LC1145二叉树着色游戏 | dfs+贪心
|
机器学习/深度学习 Java
【每日一题Day64】LC1799N 次操作后的最大分数和 | 状态压缩dp 状态压缩+dfs+记忆化搜索
每个数字有两种状态,删除或者未删除,因此可以使用状态压缩记录未删除的数字情况state,便于使用位运算进行状态的遍历及转移;使用状态压缩dp找到将所以数字删除的最大分数
113 0
【每日一题Day64】LC1799N 次操作后的最大分数和 | 状态压缩dp 状态压缩+dfs+记忆化搜索