#207
Medium
BFS / DFS

Course Schedule

判断在先修课依赖下能否完成所有课程。

DFSTopological Sort

题目定位

题目本质上是 DAG / 环检测问题,只是外表包装成了先修课依赖,因此 DFS 染色和 BFS 入度都很合适。

关键观察

只要有向图里存在环,答案就一定是否定的。

目标复杂度

O(V + E) / O(V + E)

这题的解法思路怎么拆

1

题目本质上是 DAG / 环检测问题,只是外表包装成了先修课依赖,因此 DFS 染色和 BFS 入度都很合适。

2

只要有向图里存在环,答案就一定是否定的。

3

先识别图模型,并定义邻居如何生成。

4

无权最短路优先 BFS,结构搜索优先 DFS。

参考实现

Python
# Generic pattern template
from collections import deque

def bfs(start):
    queue = deque([start])
    visited = {start}
    while queue:
        node = queue.popleft()
        for nxt in graph[node]:
            if nxt not in visited:
                visited.add(nxt)
                queue.append(nxt)

def dfs(node):
    visited.add(node)
    for nxt in graph[node]:
        if nxt not in visited:
            dfs(nxt)

常见坑点

warning

只用 visited,却没有区分当前递归栈状态。

warning

把拓扑排序里的入度 BFS 和普通 BFS 混为一谈。

高频追问

如果要返回一种合法修课顺序,怎么做?

为什么入度 BFS 能证明无环?

继续刷相关题

先把 BFS / DFS 这个模式刷成体系,再去做更难变体。

view_week回到模式页
LeetCode 207. Course Schedule 题解思路 | Interview AiBox