算法日常・每日刷题--<BFS拓扑排序>4

LCR 113. 课程表 II - 力扣(LeetCde)

题目理解

总共有 numCourses 门课,编号0 ~ numCourses‑1prerequisites[i] = [a,b]学 a 课,必须先学 b 课

要求返回任意一个合法上课顺序

  • 存在拓扑序列(无环):返回上课顺序数组
  • 图有环(循环依赖,课学不完):返回空数组

和课程表 I 区别:课程表 I 只需要判断 true/false;本题需要把拓扑排序的序列输出出来。

核心思路 BFS 拓扑排序

  1. 建图(邻接表)b → a,b 上完之后才可以上 a;统计每门课的入度(还有几门先修没上完)
  2. 入度为 0 全部入队列:不需要先修、可以直接学的课程
  3. BFS 遍历
    • 取出队头课程,加入结果集合(代表这门课已经上完)
    • 把它所有后继课程入度减一(消除这门课带来的依赖)
    • 如果后继课程入度变成 0,说明它的全部先修课完成,入队列
  4. 最后判断
    • 如果结果数组长度等于总课程数:全部课都上完,直接返回结果
    • 长度不够:说明有环,返回空数组
cpp 复制代码
class Solution {
public:
    vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
        vector<vector<int>> edges(numCourses); // 临接表
        vector<int> in(numCourses,0);

        // 构建图
        for (auto e : prerequisites) {
            int a = e[0];
            int b = e[1];
            edges[b].push_back(a);
            in[a]++;
        }

        vector<int> ret;
        queue<int> q;
        for (int i = 0; i < numCourses; i++) {
            if (in[i] == 0) {
                q.push(i);
            }
        }

        while (q.size()) {
            int a = q.front();
            q.pop();
            ret.push_back(a);
            for (auto next : edges[a]) {
                // 将有关边的入度--
                in[next]--;
                if (in[next] == 0) {
                    q.push(next);
                }
            }
        }
        if (ret.size() == numCourses)
            return ret;
        else
            return {};
    }
};
相关推荐
鹿角片ljp3 分钟前
LeetCode 64:最小路径和复盘|二维 DP 与 ACM 模式完整写法
java·数据结构·算法
彧azz1 小时前
算法设计与分析:贪心与动态规划
数据结构·学习·算法·贪心算法·动态规划
Beyond_System|系统之外2 小时前
【学编程】Python基础编程题100道(21-60)
开发语言·python·算法
漂流瓶jz4 小时前
UVA-1442 洞穴 题解答案代码 算法竞赛入门经典第二版
c++·算法·题解·aoapc·算法竞赛入门经典·uva
叠层归一研究院5 小时前
基于极限自指的叠层归一宇宙结构理论——无元外部封闭系统的内生区分模型
人工智能·经验分享·算法·agi
Selvaggia6 小时前
Diffusion Model 的基本原理与模型架构
算法
wabs6667 小时前
关于二叉树【力扣572.另一棵树的子树的思考】
数据结构·c++·算法·leetcode·二叉树
hanlin038 小时前
刷题笔记:力扣第41题-缺失的第一个正数
笔记·算法·leetcode
shehuiyuelaiyuehao8 小时前
算法50,分治归并,数组中的逆序对
java·算法
阳明山水9 小时前
校准分位数驱动智能库存决策
人工智能·深度学习·算法·机器学习·架构