记录编号 394771 评测结果 AAAAAAAAAE
题目名称 [NOIP 2015]信息传递 最终得分 90
用户昵称 GravatarWildRage 是否通过 未通过
代码语言 C++ 运行时间 0.508 s
提交时间 2017-04-14 14:31:22 内存使用 4.51 MiB
显示代码纯文本
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<iostream>
#include<cstring>
#include<cstdio>
#include<stack>
using namespace std;
const int N=200005;
struct edge{
	int END,next;
}v[N];
int first[N],p=1;
int ans=0x7fffffff;
int n,dindex;
stack<int> st;
int dfsn[N],low[N];
bool instack[N],flag[N];
void add(int a,int b){
	v[p].END=b;
	v[p].next=first[a];
	first[a]=p++;
}
void tarjan(int x){
	dfsn[x]=low[x]=dindex++;
	st.push(x);
	instack[x]=1;
	if(!flag[v[first[x]].END]){
		for(int i=first[x];i!=-1;i=v[i].next){
			if(!dfsn[v[i].END]){
				tarjan(v[i].END);
				low[x]=min(low[x],low[v[i].END]);
			}
			else if(instack[v[i].END]){
				low[x]=min(low[x],dfsn[v[i].END]);
			}
		}
		flag[x]=1;
	}
	if(dfsn[x]==low[x]){
		int size=0;
		do{
			x=st.top();
			st.pop();
			instack[x]=0;
			size++;
		}while(dfsn[x]!=low[x]);
		if(size>1){
			ans=min(ans,size);
		}
	}
}
int main()
{
	freopen("2015message.in","r",stdin);
	freopen("2015message.out","w",stdout);
	memset(first,-1,sizeof(first));
	cin>>n;
	int s;
	dindex=1;
	for(int i=1;i<=n;i++){
		cin>>s;
		add(i,s);
	}
	for(int i=1;i<=n;i++){
		if(!dfsn[i]){
			tarjan(i);
		}
	}
	cout<<ans<<endl;
}