课程表-python

 问题:

# 你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。 
#
# 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,
# 其中 prerequisites[i] = [ai, bi] ,表
# 示如果要学习课程 ai 则 必须 先学习课程 bi 。
#
#
# 例如,先修课程对 [0, 1] 表示:想要学习课程 0 ,你需要先完成课程 1 。

方法:

一、广度优先遍历

需要一个队列进行搜索,结合拓扑排序

def test(numCourses, prerequisties):
    edges = collections.defaultdict(list)
    vertexs = [0] * numCourses
    # put data
    for each in prerequisties:
        edges[each[1]].append(each[0])
        vertexs[each[0]] += 1
    # put not pre course into queue
    q = collections.deque([e for e in range(numCourses) if vertex[e]==0])
    # node visited flag
    visited = 0
    while q:
        visited += 1
        u = q.popleft()
        for e in edges[u]:
            vertexs[e] -= 1
            if vertexs[e]==0:
                q.append(e)
    return visited == numCourses

 二、深度优先

def test(numCourses, prerequisites):
    edges = collcetions.defaultdict(list)
    visited = [0]*numCourses
    result = list()
    valid = True
    for each in prerequisites:
        edges[each[1]].append(each[0])
    def dfs(v):
        nonlocal valid
        visitd[v] == 1
        for e in edges[v]:
            if visited[e]==0:
                dfs(e)
                if not valid:
                    return
            elif visited[e]==2:
                valid = False
                return
        visited[v] == 2
        result.append(v)
        
    for i in range(numCourses):
        if valid and not visited[i]:
            dfs(i)
    return valid

 

posted @ 2021-10-19 15:09  今夜无风  阅读(149)  评论(0编辑  收藏  举报