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
该篇博客介绍了一个使用拓扑排序解决课程依赖问题的算法。通过建立课程依赖图,利用邻接表存储课程之间的先修关系,并使用队列进行遍历。当找到入度为0的节点(即没有先修课程的课程)时,将其加入答案并更新相邻节点的入度。此方法不断迭代,直至所有课程都被加入答案或发现图中存在环。提供的代码实现了这一逻辑,用于找出可以按照拓扑排序学习的课程顺序。
1809

被折叠的 条评论
为什么被折叠?



