[leetcode]Course Schedule

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

  

原文地址:https://www.cnblogs.com/lautsie/p/12266723.html