记录编号 |
221158 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[NOIP 2015]信息传递 |
最终得分 |
100 |
用户昵称 |
liu_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;
}