判断图中是否存在环

题目:课程表

链接: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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值