拓扑排序
有向无环图(DAG)
有向无环图:一个无回路的有向图,如果一个有向图无法从某个顶点出发经过若干条边回到该点,则这个图是一个有向无环图(DAG 图)。

AOV 网:顶点活动图
在有向无环图的基础上,用顶点来表示一个活动,用边来表示活动执行的先后顺序。

拓扑排序
拓扑排序:找到做事的先后顺序。每次取出入度为 0 的点,并且删除该点相连的边,排序进行。
实现拓扑排序
- 找出图中入度为 0 的点
- 删除与该点连接的边
- 重复上述步骤直到没有点或者没有入度为 0 的点
借助队列,来一次 BFS:
- 初始化:把所有入度为 0 的点加入到队列
- 当队列不为空:
- 拿出队头元素,加入到最终结果
- 删除与元素相连的边
- 判断:与删除的边相连的点,入度是否变为 0
207. 课程表
题目链接:207. 课程表
题目描述:

题目解析:
- 给我们一个 int 数,代表 id 为 0 到 numCourses 的课程
- 给我们一个 prerequisites 数组,其中从后往前代表学习顺序
- 让我们看能否排课,将课程学完,必须保证学习顺序
解题思路:
- 我们使用二维数组 List,来表示图,每一个下标对应的一维数组,表示该点指向的点
- 我们遍历一次 prerequisites 数组,将最后的 n-1 列的值当成点,其余入该点对应的一维数组。除了 n-1 列,其余对应的入度数组对应下标值加一
- 在进行一次 BFS 即可
- 注意事项:每个点只能入一次队,prerequisites 可以是 [] 数组,在前面要排除
解题代码:
class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
prerequisites.length;
(m == ) ;
prerequisites[].length;
List<List<Integer>> edges = <>();
( ; i < numCourses; i++) {
edges.add( <>());
}
Queue<Integer> queue = <>();
[] in = [numCourses];
[] flag = [numCourses];
( ; i < m; i++) {
( ; j < n - ; j++) {
edges.get(prerequisites[i][n - ]).add(prerequisites[i][j]);
in[prerequisites[i][j]]++;
}
}
( ; i < numCourses; i++) {
(in[i] == ) {
queue.add(i);
flag[i] = ;
}
}
(queue.isEmpty()) ;
(!queue.isEmpty()) {
queue.poll();
( ; i < edges.get(tmp).size(); i++) {
in[edges.get(tmp).get(i)]--;
}
( ; i < numCourses; i++) {
(in[i] == && !flag[i]) {
queue.add(i);
flag[i] = ;
}
}
}
( ; i < numCourses; i++) {
(in[i] != ) {
;
}
}
;
}
}





