问题:
# 你这个学期必须选修 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