拓扑排序-课程表

问题理解:

一共有 n 门课要上,编号为 0 ~ n-1。

先决条件[1, 0],意思是必须先上课 0,才能上课 1。

给你 n 、和一个先决条件表,请你判断能否完成所有课程。

bfs方法模板

def find_order(n=4):
    courses = [[1, 0], [2, 0], [3, 1], [3, 2]]
    graph = [[] for _ in range(n)]  # 构建节点依赖图
    in_degree = [0] * n             # 每个节点还依赖多少节点
    # 注意方向,根据实际意义标注节点方向是进还是出
    for course_in, course_out in courses:
        graph[course_out].append(course_in)
        in_degree[course_in] += 1
    queue = collections.deque()   # 没有依赖节点(in_degree=0)就可以学习了,放入队列中准备出队
    [queue.append(e) for e in in_degree if e==0]

    nums_choose = 0
    topo_sort = []
    while queue:
        cur_node = queue.popleft()
        nums_choose += 1
        topo_sort.append(cur_node)
        for e in graph[cur_node]:  # 拿出入度为零的点
            in_degree[e] -= 1
            if in_degree[e] == 0:
                queue.append(e)
    return topo_sort if nums_choose==n else None

 

posted @ 2022-07-29 14:31  今夜无风  阅读(48)  评论(0)    收藏  举报