小朋友崇拜圈
班里N个小朋友,每个人都有自己最崇拜的一个小朋友(也可以是自己)。
在一个游戏中,需要小朋友坐一个圈,
每个小朋友都有自己最崇拜的小朋友在他的右手边。
求满足条件的圈最大多少人?
小朋友编号为1,2,3,…N
输入第一行,一个整数N(3<N<100000)
接下来一行N个整数,由空格分开。
要求输出一个整数,表示满足条件的最大圈的人数。
例如:
输入:
9
3 4 2 5 3 8 4 6 9
则程序应该输出:
4
解释:
如图p1.png所示,崇拜关系用箭头表示,红色表示不在圈中。
显然,最大圈是[2 4 5 3] 构成的圈
再例如:
输入:
30
22 28 16 6 27 21 30 1 29 10 9 14 24 11 7 2 8 5 26 4 12 3 25 18 20 19 23 17 13 15
程序应该输出:
16
package 第09届蓝桥杯JavaC组省赛;
import java.util.*;
public class I {
static boolean[] vis;//代表
static int max = -1;//求圈最大人数
static int n;//n个小朋友
static int[] a;//3 4 2 5 3 8 4 6 9//储存每个小朋友崇拜的人
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
a = new int[n + 1];
vis = new boolean[n + 1];
for (int i = 1; i <= n; i++)
a[i] = sc.nextInt();
for (int i = 1; i <= n; i++) {
dfs(i);
}
System.out.println(max);
}
private static void dfs(int p) {//p=1//3 4 2 5 3 8 4 6 9
int sum = 0;//临时储存一个圈的人数
int t = p;//t=1
while (!vis[t]) {//判断是否为false。如果是false下一步
vis[t] = true;
t = a[t];//t=3
sum++;
}
if (t == p) {//如果t=p,则找到循坏
if (sum > max)
max = sum;
}
vis = new boolean[n + 1];//重新初始化 vis 数组为全 false
}
}