题目
你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 。
在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:[0,1]
给定课程总量以及它们的先决条件,请你判断是否可能完成所有课程的学习?
提示:
1、输入的先决条件是由 边缘列表 表示的图形,而不是 邻接矩阵 。详情请参见图的表示法。
2、你可以假定输入的先决条件中没有重复的边。
3、1 <= numCourses <= 10^5
运行成功的代码
class Solution(object):
def canFinish(self, numCourses, prerequisites):
"""
:type numCourses: int
:type prerequisites: List[List[int]]
:rtype: bool
"""
indegrees = [0 for _ in range(numCourses)] # 入度列表
adjacency = [[] for _ in range(numCourses)] # 邻接矩阵
queue = deque() # 入度为0的结点队列
for cur, pre in prerequisites:
indegrees[cur]+=1
adjacency[pre].append(cur)
for i in range(len(indegrees)): # 当前入度为0的结点入队
if indegrees[i]==0:
queue.append(i)
count = 0
while queue:
node = queue.popleft()
count+=1
for cur in adjacency[node]:
indegrees[cur]-=1
if indegrees[cur] == 0:
queue.append(cur)
return count == numCourses