LeetCode每日一题:1462. 课程表 IV(2023.9.12 C++)

目录

[1462. 课程表 IV](#1462. 课程表 IV)

题目描述:

实现代码与解析:

拓扑排序

原理思路:


1462. 课程表 IV

题目描述:

你总共需要上 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 个查询的答案。

示例 1:

复制代码
输入:numCourses = 2, prerequisites = [[1,0]], queries = [[0,1],[1,0]]
输出:[false,true]
解释:课程 0 不是课程 1 的先修课程,但课程 1 是课程 0 的先修课程。

示例 2:

复制代码
输入:numCourses = 2, prerequisites = [], queries = [[1,0],[0,1]]
输出:[false,false]
解释:没有先修课程对,所以每门课程之间是独立的。

示例 3:

复制代码
输入:numCourses = 3, prerequisites = [[1,2],[1,0],[2,0]], queries = [[1,0],[1,2]]
输出:[true,true]

提示:

  • 2 <= numCourses <= 100
  • 0 <= prerequisites.length <= (numCourses * (numCourses - 1) / 2)
  • prerequisites[i].length == 2
  • 0 <= ai, bi <= n - 1
  • ai != bi
  • 每一对 [ai, bi]不同
  • 先修课程图中没有环。
  • 1 <= queries.length <= 104
  • 0 <= ui, vi <= n - 1
  • ui != vi

实现代码与解析:

拓扑排序

cpp 复制代码
class Solution {
public:
    // 邻接表
    vector<int> e = vector<int>(5010, 0), ne = vector<int>(5010, 0), h = vector<int>(110, -1);
    int idx = 0;

    // 加边
    void add (int a, int b)
    {
        e[idx] = b, ne[idx] = h[a], h[a] = idx++;
    }

    vector<bool> checkIfPrerequisite(int numCourses, vector<vector<int>>& prerequisites, vector<vector<int>>& queries) {
        vector<vector<bool>> sumres(numCourses, vector<bool>(numCourses));
        vector<bool> res;
        vector<int> indeg(numCourses, 0);

        for (auto t: prerequisites)
        {
            add(t[0], t[1]);
            indeg[t[1]]++; // 入度++
        }

        queue<int> q;
        for (int i = 0; i < numCourses; i++)
        {
            if (indeg[i] == 0) q.push(i); // 度为 0 入队
        }

        // bfs
        while (q.size())
        {
            int t = q.front();
            q.pop();

            for (int i = h[t]; ~i; i = ne[i])
            {
                int j = e[i];
                sumres[t][j] = true; // 直接相连true

                indeg[j]--; // 入度--
                if (indeg[j] == 0) q.push(j);

                for (int k = 0; k < numCourses; k++)
                    sumres[k][j] = sumres[k][t] || sumres[k][j]; // 传递, 间接相连

            }
        }

        for (auto t: queries)
        {
            res.push_back(sumres[t[0]][t[1]]);
        }
        return res;
    }
};

原理思路:

bfs拓扑排序。只深搜会超时。

拓扑排序详解(带有C++模板)_Cosmoshhhyyy的博客-CSDN博客

因为课程间接传递也可以,注意把上一个结点信息,传递给下一个结点即可。和最短路算法的最短路更新相似。

相关推荐
wuweijianlove9 分钟前
算法的平均复杂度建模与性能回归分析的技术7
算法·数据挖掘·回归
子琦啊13 分钟前
【算法复习】字符串 | 两个底层直觉,吃透高频题
linux·运维·算法
code_pgf2 小时前
Octo 算法详解-开源通用机器人策略模型技术报告
算法·机器人·开源
嘻嘻哈哈樱桃2 小时前
牛客经典101题题解集--动态规划
java·数据结构·python·算法·职场和发展·动态规划
脱氧核糖核酸__2 小时前
LeetCode热题100——234.回文链表(两种解法)
c++·算法·leetcode·链表
IronMurphy2 小时前
【算法四十二】118. 杨辉三角 198. 打家劫舍
算法
电科一班林耿超2 小时前
第 16 课:动态规划专题(二)—— 子序列与子数组问题:面试最高频的 DP 题型
数据结构·算法·动态规划
生信研究猿3 小时前
leetcode 416. 分割等和子集
算法·leetcode·职场和发展
狗哥哥3 小时前
面包屑自动推导的算法设计:从“最短路径匹配”到工程可落地
算法·架构