题目要求
分析问题
大意是首先输入的数字代表有几个小朋友,第二行输入的数据是从第一个小朋友开始他(她)最崇拜的人是第几个小朋友,然后看这些小朋友所组成的最大崇拜圈的长度。因此我们可以想到要用图论相关知识——深度优先搜索dfs,对每个小朋友进行一次dfs并且用maxLen储存最长的len,最后输出maxLen.
代码
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n=scan.nextInt();
// 注意!!注意!!
// 这里走了一个巧,就是因为小朋友的下标从1开始,因此
// 我们n+1的空间,不使用0号位置,直接从1号位置开始放数据
int[] list=new int[n+1];
//在此输入您的代码...
for(int i=1;i<=n;i++)
{
list[i]=scan.nextInt();
}
int maxLen=0;
for(int i=1;i<=n;i++)
{
// 设置每个len为当前小朋友dfs后的长度
int len=dfs(list,i,0);
if (maxLen<len)
{
maxLen=len;
}
}
System.out.println(maxLen);
scan.close();
}
public static int dfs(int[] list,int start,int len)
{
int key=list[start];
len++;
while(start!=key)
{
if(len>list.length)
{
return 0;
}
// 去找这个小朋友所崇拜的小朋友
key=list[key];
len++;
}
return len;
}
}