拓扑排序,可以用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