有向图是否存在环
LeetCode题目:207. Course Schedule
题目链接:https://leetcode.com/problems/course-schedule/
题目大意:
现在你总共有 n 门课需要选,记为 0 到 n-1。在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1]
给定课程总量以及它们的先决条件,判断是否可能完成所有课程的学习?
来源:力扣(LeetCode)
中文翻译链接:https://leetcode-cn.com/problems/course-schedule
解法分析
BFS
BFS解法一般借助于队列实现,把入度为0的节点放入队列,然后把该节点指向的下一个节点入度减一,然后继续寻找入度为0的节点。
因为如果有环的话,环内节点的入度不会为0,所以就不可能加入到队列,就更不可能加入到结果中的list中。
所以最后只需要判断list.size和节点数量是否相等
public boolean canFinish(int numCourses, int[][] prerequisites) {
// 用于存放每个节点后面的节点
List<Integer>[] nextCourses = new List[numCourses];
// 每个节点的入度
int[] preNum = new int[numCourses];
for (int i = 0; i < numCourses; i++) {
nextCourses[i] = new ArrayList<>();
}
for (int[] prerequisite : prerequisites) {
int pre = prerequisite[