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

你这个学期必须选修 numCourses 门课程,课程编号为 0 到 numCourses−1。
在选修某些课程之前,需要先完成一些先修课程。
先修课程关系由数组 prerequisites 给出,其中 prerequisites[i]=[ai,bi] 表示:如果要学习课程 ai,必须先学习课程 bi。
请判断是否可能完成所有课程的学习。
如果可以完成所有课程,输出 true;否则输出 false。
第一行输入整数 numCourses ,表示课程数量。 第二行输入整数 m,表示先修课程关系数量。 接下来输入 m 行,每行包含两个整数 ai 和 bi,表示学习课程 ai 之前必须先完成课程 bi。
如果可以完成所有课程,输出:
true
否则输出:
false
2
1
1 0
true
总共有 2 门课程。
学习课程 1 之前,需要先完成课程 0。
可以先学习课程 0,再学习课程 1,因此可以完成所有课程。
2
2
1 0
0 1
false
学习课程 1 之前,需要先完成课程 0。
学习课程 0 之前,又需要先完成课程 1。
两门课程互相依赖,无法完成所有课程。
1<=numCourses<=2000
0<=m<=5000
0<=ai,bi<numCourses
所有先修课程关系互不相同。
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.