LC 207课程表Course Schedule 中等
给定 numCourses 门课与先修关系 [a, b](修 a 前须先修 b),判断能否修完全部课程,本质是有向图是否无环。
思路 拓扑排序 Kahn:统计入度,入度为 0 的课程入队,修完一门把后继入度 -1;最后修完数等于课程数则有解。O(V+E)。
class Solution: def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool: g = [[] for _ in range(numCourses)] indeg = [0] * numCourses for a, b in prerequisites: g[b].append(a) indeg[a] += 1 q = [i for i in range(numCourses) if indeg[i] == 0] cnt = 0 while q: cur = q.pop() cnt += 1 for nxt in g[cur]: indeg[nxt] -= 1 if indeg[nxt] == 0: q.append(nxt) return cnt == numCourses