#题目内容
你这个学期必须选修numcourse门课程,记为0到numcourse-1。
在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:【0,1】
给定课程总量以及它们的先决条件,请你判断是否可能完成所有课程的学习?
#解题思路
拓扑序列
创建一个记录入度的数组,一个记录入度为0的队列,一个邻接表记录某个课程的后修课程。
广度遍历:通过将入度为0的队列中元素删去,numcourse就减一,在其邻接表的后修课程入度减一,当存在入度为0的课程则就如队列,直到队列中没有元素,此时通过判断numcourse是否为0,可以得到是否能学完所有课程(即是否存在环)
from collections import deque
class Solution:
def canFinish(self, numCourses: int, prerequisites:
List[List[int]]) -> bool:
indegrees = [0 for i in range(numCourses)]
adlist = [[] for i in range(numCourses)]
res = deque()
for cur,pre in prerequisites:
indegrees[cur] += 1
adlist[pre].append(cur)
for i in range(numCourses):
if indegrees[i] == 0:
res.append(i)
while res:
pre = res.popleft()
numCourses -= 1
for num in adlist[pre]:
indegrees[num] -= 1
if indegrees[num] == 0:
res.append(num)
return not numCourses