小朋友崇拜圈

班里N个小朋友,每个人都有自己最崇拜的一个小朋友(也可以是自己)。
在一个游戏中,需要小朋友坐一个圈,
每个小朋友都有自己最崇拜的小朋友在他的右手边。
求满足条件的圈最大多少人?

小朋友编号为1,2,3,…N
输入第一行,一个整数N(3<N<100000)
接下来一行N个整数,由空格分开。

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

输入:
9
3 4 2 5 3 8 4 6 9

程序应该输出:4
输入: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
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int a[100001]={0};
//a		:	小朋友 (下标从1开始 忽略了下标0这个元素) 
int func(int index){
	set<int> s1;//set是一个容器 里面不能存在相同的元素 
	//如果自己膜拜自己 则返回1 
	if(a[index]==index){
		return 1;
	}else{
		//i	:	膜拜的人
		//index	:	自己的下标 
		//sum	:	圈子的人数(起始为1,因为自己也算) 
		int i=a[index],sum=1;
		s1.insert(index);
		while(1){
			/*pari
				第一个属性是迭代器	frist
					指向该元素的迭代器 
				第二个属性布尔值	second
					成功返回true 失败返回false 
			*/
			//set里存在相同的元素会导致插入失败,返回一个pari类型的对象,
			if(!s1.insert(i).second)
			{
				if(i==index)//头尾相接
				{
					return sum;
				}else{//不是头尾相接 
					return 0;
				}
			}
			sum++;
			i = a[i];//更新膜拜的人 
		}
	}
}
int main(){
	int n=0,num=0;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	for(int i=1;i<=n;i++)
	{
		int result=0;
		result = func(i);
		num=num>result?num:result;//取最大值 
	}
	cout<<num;
}

满足以上两组数据要求

类似文章