题目:课程表
链接:https://leetcode.cn/problems/course-schedule/description/ 207. 课程表 - 力扣(LeetCode)
题目分析:因为是要求满足学习某些课程后才能满足学习另一些的课程的要求,所以题目为有向图中是否存在环
方法有两种:
第一种:dfs方法:
将每个位置分为三种状态:
1.为访问为0 2.访问中为1 3.访问结束为2
记忆化列表(visited)初始化所有访问的位置为0
从图的出度入手,判断图能够到达哪些位置,并通过循环以及递归确认那些位置是否构成环,如果构成环就返回(如果构成环(即访问的位置状态为1)就返回真)。不构成环就返回假(False)并通过循环继续执行
因此当所有位置都走完(所有位置状态都为2)且不构成环时,返回真
反之返回假
class Solution:
def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
#课程表dfs方法
self.dict=defaultdict(list)
for [i,j] in prerequisites:
self.dict[j].append(i)
self.vistied=[0 for i in range(numCourses)]
self.flag=False
def dfs(i):
if self.vistied[i]==2:
return False
elif self.vistied[i]==1:
self.flag=True
return True
self.vistied[i]=1
for j in self.dict[i]:
if not dfs(j):
continue
else:
return False
self.vistied[i]=2
return False
for i in range(numCourses):
dfs(i)
if (not self.flag) and (0 not in self.vistied):
return True
else:
return False