本题本质上就是给定一张有向图,判断是否存在一个合法的拓扑序列。
在基础知识部分说过了,图中如果存在环,则不存在合法的拓扑序列。
但我们在代码实现的过程中无需特别判环,只需要统计已经处理的课程个数,如果其大小不等于numCourses , 则代表图中有环无法被消解,则输出false , 否则输出true
特别注意,在算法讲解的时候,我们的依赖关系是正的,每次根据后驱寻找前驱。但是代码实现过程中,通过邻接表找前驱并不好实现,真正好实现的是通过前驱找后驱,所以将关系反着来建边,这样才能更方便的通过邻接表寻找那些依赖的关系。

一名学生需要在一个学期内修完 numCourses 门课程,这些课程的编号为 0 到 numCourses−1。其中部分课程不是完全独立的,在选修它们之前,学生必须先完成指定的先修课程。
课程之间的先修关系由列表 prerequisites 给出。列表中的每一项 [ai,bi] 表示:如果想学习课程 ai,就必须先学习课程 bi。
请根据这些先修关系判断:是否存在一种修课安排,使得所有课程都能顺利完成。
约束条件:
输入包含两个参数:
numCourses,表示课程总数。prerequisites,其中每个元素都是长度为 2 的数组 [ai,bi],表示学习课程 ai 之前必须先完成课程 bi。返回一个布尔值。如果能够完成所有课程,返回 true;否则返回 false。
输入
1
0
输出
true
说明
总共有 1 门课程,先修关系数量为 0。
没有任何先修要求,课程 0 可以直接完成,因此可以完成所有课程,返回 true。
输入
4
3
1 0
2 1
3 2
输出
true
说明
总共有 4 门课程,先修关系数量为 3。
学习课程 1 前需要完成课程 0,学习课程 2 前需要完成课程 1,学习课程 3 前需要完成课程 2。
可以按 0 → 1 → 2 → 3 的顺序完成所有课程,因此返回 true。
输入
3
3
1 0
2 1
0 2
输出
false
说明
总共有 3 门课程,先修关系数量为 3。
学习课程 1 前需要完成课程 0;
学习课程 2 前需要完成课程 1;
学习课程 0 前又需要完成课程 2。
这三条要求形成循环依赖 0 → 1 → 2 → 0,因此无法完成所有课程,返回 false。
© CodeFun2000 · 使用条款
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册