210. 课程表 II
拓扑排序中最前面的节点,该节点一定不会有任何入边(入度为0),也就是它没有任何的先修课程要求。当我们将一个节点加入答案中后,所有的neighbours入度减1,代表着它的相邻节点少了一门先修课程的要求。如果某个相邻节点变成了「没有任何入边的节点」,那么就代表着这门课可以开始学习了(加入队列)。按照这样的流程,我们不断地将没有入边的节点加入答案,直到答案中包含所有的节点(得到了一种拓扑排序)或者不存在没有入边的节点(图中包含环)。
def findOrder(self, numCourses: int, prerequisites: List[List[int]]) -> List[int]:
from collections import defaultdict
dic = defaultdict(list)
incoming_num = [0]*numCourses
for edge in prerequisites:
dic[edge[1]].append(edge[0])
incoming_num[edge[0]]+=1
queue = [course for course in range(numCourses) if incoming_num[course]==0]
res = []
while queue:
cur_course = queue.pop(0)
res.append(cur_course)
for neigh in dic[cur_course]:
incoming_num[neigh]-=1
if incoming_num[neigh]==0:
queue.append(neigh)
if len(res)!=numCourses:
return []
return res