问题
例子
思路
课程安排图是否是 有向无环图(DAG)
使用拓扑排序(广度遍历,深度遍历)
拓扑排序(Topological Sorting)可得到一个有向无环图(DAG, Directed Acyclic Graph)的所有顶点的线性序列,该序列满足:
- 每个顶点出现且只出现一次。
- 若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面。
广度遍历
使用邻接表List<List<Integer>> 和入度数组,和入度为0元素的队列
-
方法1
$$$$
-
方法2
$$$$
代码
//方法1
class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
//构建入度数组和邻接表
int[] in = new int[numCourses];
List<List<Integer>> list = new ArrayList<>();
for(int i=0; i<numCourses; i++)
list.add(new ArrayList<Integer>());
for(int[] arr : prerequisites) {
in[arr[0]]++;
list.get(arr[1]).add(arr[0]);
}
//把入度为0的课程放入队列
Queue<Integer> q = new LinkedList<>();
for(int course=0;course<in.length; course++)
if(in[course]==0) q.offer(course);
while(q.size()>0) {
int del = q.poll();
numCourses--;
for(int course : list.get(del)) {
in[course]--;
if(in[course]==0) q.offer(course);
}
}
return numCourses==0;
}
}
//方法2