蓝桥杯——小朋友崇拜圈
班里N个小朋友,每个人都有自己最崇拜的一个小朋友(也可以是自己)。
在一个游戏中,需要小朋友坐一个圈,
每个小朋友都有自己最崇拜的小朋友在他的右手边。
求满足条件的圈最大多少人?
小朋友编号为1,2,3,...N
输入
输入第一行,一个整数N(3<N<100000)
接下来一行N个整数,由空格分开。
输出
要求输出一个整数,表示满足条件的最大圈的人数。
#include<iostream>
#include <cstring>
#include<queue>
using namespace std;
const int N=100010;
int n;
int e[N],ne[N],h[N],idx,d[N];
int res=0;
void add(int a,int b){
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void topsort(){//拓扑排序,所有入度为0的点都不可能在环中
queue<int> q;
for(int i=1;i<=n;i++)
if(!d[i])q.push(i);
while(q.size()){
int t=q.front();
q.pop();
for(int i=h[t];~i;i=ne[i]){
int j=e[i];
d[j]--;
if(!d[j])q.push(j);
}
}
}
int x;
int dfs(int u,int cnt,int t){//暴搜每一个环,更新最大环
if(u==x&&t!=0){
return cnt;
}
for(int i=h[u];~i;i=ne[i]){
int j=e[i];
if(d[j])return dfs(j,cnt+1,t+1);
}
}
int main(){
cin>>n;
memset(h,-1,sizeof h);
for(int i=1;i<=n;i++){
int b;
cin>>b;
add(i,b);
d[b]++;
}
topsort();
for(int i=1;i<=n;i++){
if(d[i]){
x=i;
res=max(res,dfs(i,0,0));
}
}
cout<<res<<endl;
return 0;
}