题目定位
题目本质上是 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 这个模式刷成体系,再去做更难变体。