小朋友的崇拜圈/环状DFS/DFS模板里有回溯操作!!

题目如下

班里N个小朋友,每个人都有自己最崇拜的一个小朋友(也可以是自己)。

在一个游戏中,需要小朋友坐一个圈,

每个小朋友都有自己最崇拜的小朋友在他的右手边。

求满足条件的圈最大多少人?

小朋友编号为1,2,3,…N

输入第一行,一个整数N(3

接下来一行N个整数,由空格分开。

要求输出一个整数,表示满足条件的最大圈的人数。

例如:

输入:

9

3 4 2 5 3 8 4 6 9

则程序应该输出:

4

题解:

打眼一看,是个深搜题,与以往不同的是,这是个环状深搜,那么我们套入深搜五部曲:

1.参数:输入参数应该有n,nums,visited,其中visited是一维数组,而且这道题还要考虑到当前坐标点cur当前节点start和圈的人数count,输出参数则是self.res,即最大的圈的人数,每次解释递归还要取一个max(res,count)

2.结束递归条件:环状DFS通用条件为:当前节点被搜索过且当前节点等于起点,即visited[cur]=True and cur=start,当然这是收集self.res计算结果的条件,如果cur不等于start也是要结束递归的

3.单层搜索逻辑:这个就简单了,不满足结束递归条件说明当前节点没有被搜索过,那就visited[cur]=True,然后递归下一个节点,即当前节点崇拜的人,并且count人数要➕1,别忘了回溯,visited[cur]=False

4.输出即可

class Solution:
    def __init__(self):
        self.ans=1
    def solve(self,n,visited,nums):
        for i in range(len(nums)):
            self.DFS(n,visited,nums,i,i,0)
        return self.ans
    def DFS(self,n,visited,nums,start,cur,count):
        if visited[cur]==True and cur==start:
            self.ans=max(self.ans,count)
            return
        if visited[cur]==True:return
        visited[cur]=True
        self.DFS(n,visited,nums,start,nums[cur]-1,count+1)
        visited[cur]=False
n=int(input())
nums=list(map(int,input().split()))
s=Solution()
visited=[False]*n
ans=s.solve(n,visited,nums)
print(ans)

你可能感兴趣的:(蓝桥杯真题,深度优先,算法)