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


    目录

    1462. 课程表 IV

    题目描述:

    实现代码与解析:

    拓扑排序

    原理思路:


    1462. 课程表 IV

    题目描述:

            你总共需要上 numCourses 门课,课程编号依次为 0 到 numCourses-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

    实现代码与解析:

    拓扑排序

    1. class Solution {
    2. public:
    3. // 邻接表
    4. vector<int> e = vector<int>(5010, 0), ne = vector<int>(5010, 0), h = vector<int>(110, -1);
    5. int idx = 0;
    6. // 加边
    7. void add (int a, int b)
    8. {
    9. e[idx] = b, ne[idx] = h[a], h[a] = idx++;
    10. }
    11. vector<bool> checkIfPrerequisite(int numCourses, vectorint>>& prerequisites, vectorint>>& queries) {
    12. vectorbool>> sumres(numCourses, vector<bool>(numCourses));
    13. vector<bool> res;
    14. vector<int> indeg(numCourses, 0);
    15. for (auto t: prerequisites)
    16. {
    17. add(t[0], t[1]);
    18. indeg[t[1]]++; // 入度++
    19. }
    20. queue<int> q;
    21. for (int i = 0; i < numCourses; i++)
    22. {
    23. if (indeg[i] == 0) q.push(i); // 度为 0 入队
    24. }
    25. // bfs
    26. while (q.size())
    27. {
    28. int t = q.front();
    29. q.pop();
    30. for (int i = h[t]; ~i; i = ne[i])
    31. {
    32. int j = e[i];
    33. sumres[t][j] = true; // 直接相连true
    34. indeg[j]--; // 入度--
    35. if (indeg[j] == 0) q.push(j);
    36. for (int k = 0; k < numCourses; k++)
    37. sumres[k][j] = sumres[k][t] || sumres[k][j]; // 传递, 间接相连
    38. }
    39. }
    40. for (auto t: queries)
    41. {
    42. res.push_back(sumres[t[0]][t[1]]);
    43. }
    44. return res;
    45. }
    46. };

    原理思路:

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

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

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

  • 相关阅读:
    动手实现深度学习(5):计算图的实现
    【Java系列】Java 基础
    华为鲲鹏服务器
    Nginx 配置 HTTPS 过程(+反向代理)
    在windows7中运行pycharm报错误“无法定位程序输入点 CreateAppContainerProfile 于动态链接库 USERENV.dll 上
    正则表达式
    centos安装supervisor和配置进程
    Antdv+Asp.net WebApi开发学生信息管理系统(一)
    用友移动管理系统存在任意文件上传漏洞 附POC
    计算机网络八股文
  • 原文地址:https://blog.csdn.net/Cosmoshhhyyy/article/details/132836023