记录编号 450581 评测结果 AAAAAAAAAA
题目名称 [NOIP 2015]信息传递 最终得分 100
用户昵称 GravatarHyoi_0Koto 是否通过 通过
代码语言 C++ 运行时间 0.050 s
提交时间 2017-09-16 16:12:37 内存使用 1.42 MiB
显示代码纯文本
/*written by 0koto*/
#prag\
ma GCC optimize("O3")
#include<cstdio>
#include<cctype>
#include<cstring>
#include<iostream>
#include<queue>
#include<vector>
#define loop(i,j,k) for(int i=j;i<=k;i++)
//#define leaf(u) for(int i=head[u];i;i=next[i])
using namespace std;
inline void in(int &x){
    x=0;int f=1;char c=getchar();
    while(!isdigit(c)){if(!(c-'-'))f=-1;c=getchar();}
    while (isdigit(c))x=(x<<3)+(x<<1)+(c^48),c=getchar();
    x*=f;
}
inline void out(int x){
    if(!x){putchar('0');return;}
    if(x<0)x=~x+1,putchar('-');
    char c[30]={0};
    while(x)c[++c[0]]=x%10+48,x/=10;
    while(c[0])putchar(c[c[0]--]);
}
const int maxn=200001;
const int inf=0x7effffff;
int n,a;
int next[maxn];
struct node{
	int i,o;
}b[maxn];
queue<int> q;
int d[maxn],ans=inf;
bool vis[maxn];
inline void dfs(int u,int dep){
	if(dep>ans) return;
	if(vis[u]){
		ans=min(ans,dep);return;
	}
	vis[u]=1;
	int v=next[u];
	if(b[v].i) dfs(v,dep+1);
}
inline void toposort(){
	loop(i,1,n)if(!b[i].i) q.push(i);
	while(!q.empty()){
		int u=q.front();q.pop();
		int v=next[u];
		if(b[v].i) b[v].i--;
		if(!b[v].i) q.push(v);
	}
	loop(i,1,n) if(b[i].i&&(!vis[i])) dfs(i,0);
}
inline int koto(){
	freopen("2015message.in","r",stdin);
	freopen("2015message.out","w",stdout);
	in(n);
	loop(i,1,n) in(a),next[i]=a,b[i].o++,b[a].i++;
	toposort();
	out(ans);
}
int hibiki=koto();
int main(){;}