课程表

发布时间 2024-01-11 23:11:09作者: 岁叶年华
# 使用深度搜索栈的方式实现
class Solution:
    def canFinish(self, numCourses, prerequisites):
        # 构建图的邻接表
        self.graph = {i: [] for i in range(numCourses)}
        for edge in prerequisites:
            course, pre_course = edge
            self.graph[pre_course].append(course)

        # 记录节点的访问状态,0: 未访问, 1: 正在访问, -1: 已访问
        self.visited = [0] * numCourses

        def has_cycle(course):
            stack = [(course, 0)]

            while stack:
                current_course, state = stack.pop()

                if state == 0:
                    # 标记为正在访问
                    self.visited[current_course] = 1
                    stack.append((current_course, 1))

                    # 将邻居节点入栈
                    for neighbor in self.graph[current_course]:
                        if self.visited[neighbor] == 0:
                            stack.append((neighbor, 0))
                        elif self.visited[neighbor] == 1:
                            return True  # 遇到正在访问中的节点,说明存在环
                else:
                    # 标记为已访问
                    self.visited[current_course] = -1

            return False

        # 对每个未访问的节点进行深度搜索
        for i in range(numCourses):
            if self.visited[i] == 0:
                if has_cycle(i):
                    return False  # 存在环,无法完成所有课程的学习

        return True  # 无环,可以完成所有课程的学习

# 示例
solution = Solution()
numCourses = 2
prerequisites = [[1, 0], [0, 1]]
result = solution.canFinish(numCourses, prerequisites)
print(result)  # 输出 True