比赛 |
图的简单问题 |
评测结果 |
AAAAAAAAAA |
题目名称 |
信息传递 |
最终得分 |
100 |
用户昵称 |
Emine |
运行时间 |
0.165 s |
代码语言 |
C++ |
内存使用 |
3.56 MiB |
提交时间 |
2017-05-14 20:53:48 |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
const int maxn=200010;
const int inf=2147483647;
int n,t=0,dfn[maxn],low[maxn],to[maxn],m=0,s[maxn],top=0;
int ans=inf;
bool rd[maxn];
void tarjan(int a){
dfn[a]=++t;
low[a]=++t;
s[top++]=a;
rd[a]=true;
if(!dfn[to[a]]){
tarjan(to[a]);
if(low[to[a]]<low[a])
low[a]=low[to[a]];
}
else if(rd[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);
return 0;
}