1、问题描述
班里N个小朋友,每个人都有自己最崇拜的一个小朋友(也可以是自己)。
在一个游戏中,需要小朋友坐一个圈,
每个小朋友都有自己最崇拜的小朋友在他的右手边。
求满足条件的圈最大多少人?
小朋友编号为1,2,3,...N
输入第一行,一个整数N(3<N<100000)
接下来一行N个整数,由空格分开。
要求输出一个整数,表示满足条件的最大圈的人数。
例如:
输入格式
9
3 4 2 5 3 8 4 6 9
则程序应该输出:
4
2、代码实现
import java.util.Scanner;
public class Main {
//小朋友的个数
static int n;
//小朋友对应的崇拜者
static int[] arr;
static boolean[] visit;
//崇拜圈的大小
static int max = -1;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
arr = new int[n + 1];
visit = new boolean[n + 1];
for(int i = 1;i <= n;i++) {
arr[i] = scanner.nextInt();
}
for(int i = 1;i <= n;i++) {
//以第i的小朋友为起点,寻找崇拜圈
dfs(i);
}
System.out.println(max);
}
public static void dfs(int i) {
int count = 0;
int t = i;
//这个小朋友还没有在圈内
while(!visit[t]) {
//设置他在圈内
visit[t] = true;
//寻找当前小朋友的崇拜者
t = arr[t];
count++;
}
//是否形成崇拜圈
if(t == i) {
if(count > max) {
max = count;
}
}
//每一轮都需要重置
visit = new boolean[n + 1];
}
}