蓝桥杯——小朋友崇拜圈

班里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;
}
posted @ 2020-10-13 20:19  进化の程序猿  阅读(233)  评论(0编辑  收藏  举报