小朋友崇拜圈
班里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;
}
满足以上两组数据要求