题目
解题思路
题目相当于在有向图中判断是否存在环路
- 拓扑排序
首先记录所有点的出入度情况,将所有入度为0的点加入队列中,当队列不为空的时候,每次取出队首的点,遍历其邻接点,使得每一个邻接点的入度-1。如果所有曾在队列中的点等于课程数量,说明不存在环路。 - DFS,通过记录状态来判断是否存在环路。
代码实现
"""
拓扑排序
1. 将所有入度为0的节点入队列
2. 每次从队列取出一个节点,并将这个节点的所有临界点的入度-1
3. 判断已经处理过的节点是否和课程数量相同
"""
from collections import defaultdict
class Solution:
def canFinish(self, numCourses: int, prerequisites) -> bool:
stack = []
# 记录每个节点的入度
sin = defaultdict(int)
# 记录邻接点
mat = defaultdict(list)
# y -> x
for x, y in prerequisites:
sin[x] += 1
mat[y].append(x)
# 将入度为0的点加入队列
for i in range(numCourses):