第09届蓝桥杯JavaC组省赛--I 小朋友崇拜圈

小朋友崇拜圈
班里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
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值