记录编号 221158 评测结果 AAAAAAAAAA
题目名称 [NOIP 2015]信息传递 最终得分 100
用户昵称 Gravatarliu_runda 是否通过 通过
代码语言 C++ 运行时间 0.144 s
提交时间 2016-01-22 09:44:07 内存使用 3.53 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
const int maxn = 200005;
int ans=1<<20,n,t=0,dfn[maxn],low[maxn],to[maxn],m=0,s[maxn],top=0;
bool instack[maxn];
void tarjan(int a){
	low[a]=dfn[a]=++t;
	s[top++]=a;
	instack[a]=true;
	if(!dfn[to[a]]){
		tarjan(to[a]);
		if(low[to[a]]<low[a])low[a]=low[to[a]];
	}else if(instack[to[a]]&&dfn[to[a]]<low[a])low[a]=dfn[to[a]];
	if(dfn[a]==low[a]){
		int len = 0,j;
		do{
			j = s[--top];
			len++;
		}while(j!=a);
		if(len>1&&len<ans)ans = len;	
	}
}
int main(){
	freopen("2015message.in","r",stdin);
	freopen("2015message.out","w",stdout);
	scanf("%d",&n);
	memset(dfn,0,sizeof(dfn));
	for(int i = 1;i<=n;++i)scanf("%d",to+i);
	for(int i = 1;i<=n;++i)if(!dfn[i])tarjan(i);
	printf("%d\n",ans);
	fclose(stdin);fclose(stdout);
	return 0;
}