拓扑排序,可以用dfs做。也可以用bfs做(只有某节点的所有前驱都访问过了indegree--至0,才加入queue)
class Solution:
def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
nextCourseDict = {i:[] for i in range(numCourses)}
prevCnt = [0] * numCourses
visited = [False] * numCourses
for prerequisite in prerequisites:
next = prerequisite[0]
prev = prerequisite[1]
prevCnt[next] += 1
nextCourseDict[prev].append(next)
for i in range(numCourses):
if prevCnt[i] == 0: # no prev
path = []
path.append(i)
if not self.backtrace(i, path, visited, nextCourseDict):
return False
for i in range(numCourses):
if not visited[i]:
return False
return True
def backtrace(self, i, path, visited, nextCourseDict):
visited[i] = True
nextCourses = nextCourseDict[i]
for course in nextCourses:
if course in path: # cycle
return False
if visited[course]: # already visited
continue
path.append(course)
if not self.backtrace(course, path, visited, nextCourseDict):
return False
path.pop()
return True