#895. 课程表2

课程表2

题目描述

在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习。 如果指定的课程之间有闭环的依赖关系,则不能合理安排课表,无法修完所有课程。 已知一个学生有 n 门课程需要修,课程之间有 m 个依赖关系,问这个学生是否能修完所有课程?

输入格式

第一行有两个正整数 n、m,表示需要学习的课程数量 和 依赖关系数量,2≤n≤2000,0≤m≤5000。 后面 m 行,每行有两个正整数 a、b,a、b是课程编号,表示 a 是课程 b 的先修课(即只有学完了课程 a,才能学习课程 b)。(a!=b, 0<a,b<=n)

输出格式

如果这个学生能修完所有课,输出一个合理的课程表(按先后顺序),

样例

输入样例 1

6 6
1 2
1 3
2 4
3 5
4 6
5 6

输出样例 1

1 2 3 4 5 6

输入样例 2

4 5
1 2
1 3
2 4
3 4
4 2

输出样例 2

false

输入样例 3

7 6
1 2
1 3
2 4
3 5
4 6
5 6

输出样例 3

1 7 2 3 4 5 6

提示

分析:从题意可知,将这些课程及依赖关系表示成一个有向图,那么当图中存在闭环时是不可能修完所有课程的,因为形成闭环的几门课程相互依赖,无法选择第一门开始修的课程。 因此题目就是要求判断一个有向图中是否存在闭环,没有则输出一个合法的拓扑序。 拓扑排序 Kahn 算法。