BFS有向图解法
class Solution {
//prerequisites数组的[0,1]表示上0这门课需要先修1这们课.
// 将每门课作为节点相互关联构建为图, 存在先修课的节点,其入度>0,不存在先修课的节点入度为0.
// 构建一维数组,数组下标表示节点的课程号, 节点值表示节点的入度.
// 使用二维动态数值创建numsCourses个动态数组, 每个数组的索引代表了课程号,数组内容表示对应出度的值.
// 遍历数组填充各个课程的出度值.
// 找到入度为0的课程号,bfs它的邻接节点. 遍历一个点就将这个点的入度减一,如果这个点入度为0就把它压入queue.
public boolean canFinish(int numCourses, int[][] prerequisites) {
if (prerequisites.length == 0) return true;
int[] indegree = new int[numCourses];
List<List<Integer>> LinkedMap = new ArrayList();
for (int i = 0; i < numCourses; i++) {
LinkedMap.add(new ArrayList());
}
Queue<Integer> q = new LinkedList<>();
for (int[] pre: prerequisites) {
indegree[pre[0]]++;
LinkedMap.get(pre[1]).add(pre[0]);
}
for (int i = 0; i < numCourses; i++) {
if (indegree[i] == 0) {
q.add(i);
}
}
while (q.size() != 0) {
int tmp = q.poll();
numCourses--;
for (int pre : LinkedMap.get(tmp)) {
indegree[pre]--;
if (indegree[pre] == 0) {
q.add(pre);
}
}
}
return numCourses == 0;
}
}