本题属于 图论 中的 有向图拓扑排序 问题,可用 Kahn 算法(BFS) 解决;其本质也可视为一种“贪心”选择:每次都优先取当前 入度为 0 的课程(没有未完成的前置要求)。
建图方式:将依赖 [a, b]
视为一条 b → a 的有向边(先修 b,后修 a),并统计每个节点的入度。
算法步骤(Kahn):
[ [2,1],[1,2] ]
),返回空数组。课程编号推断:题面仅给出依赖对,样例用 0 开始编号,因此令 n = (所有出现过的最大课程编号) + 1
。这样未在依赖中出现的编号也会被覆盖(若存在)。
为了毕业你需要选择 n 门课程,这 n 门课程中存在一定的依赖关系,例如想要完成 B 课程,必须先完成 A 课程,请你找出一个可以完成全部课程的顺序,如果无论如何选择都无法完成全部课程则返回空数组。
依赖关系以如下方式输入:[[2,1],[3,2]] 。即要完成课程 2 ,必须先完成 1 ,要完成课程 3 ,必须先完成课程 2 。答案 [1,2,3] 即可但也可能出现类似 [[2,1],[1,2]] ,要完成课程 2 ,必须先完成 1 ,要完成课程 1 ,必须先完成课程 2 ,则无解,返回一个空数组即可。
数据范围:1≤n<2000,依赖关系的数量满足 0≤m≤n∗(n−1) ,保证不会有一组一模一样的依赖关系。
输入
[[1,0],[2,1]],3
输出
[0,1,2]
输入
[[1,0],[2,1]],4
输出
[0,1,2,3]