用bfs完成Topological sort

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值