比赛 图的简单问题 评测结果 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;
}