刷题方法:拓扑排序之 BFS+DFS
BFS (广度优先,遍历到每个节点的时候,先处理这个节点的所有相邻节点)
核心逻辑为判断所有节点的最终入度为0
1:统计图中每个节点的入度,生成 入度表 indegrees。
2:借助一个队列 queue,将所有入度为 00 的节点入队。
3:当 queue 非空时,依次将队首节点出队,在课程安排图中删除此节点 pre:
4:并不是真正从邻接表中删除此节点 pre,而是将此节点对应所有邻接节点 cur 的入度 -1−1,即 indegrees[cur] -= 1。
5:当入度 -1−1后邻接节点 cur 的入度为 00,说明 cur 所有的前驱节点已经被 “删除”,此时将 cur 入队。
6:在每次 pre 出队时,执行 numCourses—;
若整个课程安排图是有向无环图(即可以安排),则所有节点一定都入队并出队过,即完成拓扑排序。换个角度说,若课程安排图中存在环,一定有节点的入度始终不为 0。
因此,拓扑排序出队次数等于课程个数,返回 numCourses == 0 判断课程是否可以成功安排。
核心数据结构:
邻接表 [ [] for i in range(point)] 每个节点的依赖节点
入度表 [0 for i in range(point)] 每个节点的入度值
class Solution(object):
还没有评论,来说两句吧...