NOIP2015 信息传递

题目

vijos1979

代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath> 
#include <vector>
#include <stack>
#define N 200005
#define inf 2000000000
using namespace std; 

int n,sum[N],ans=inf;
int t,dfn[N],low[N],be[N];
vector<int> to[N];
stack<int> st;

int cnt;bool f[N];
void Tarjan(int x)
{
	dfn[x]=low[x]=++t;
	st.push(x);f[x]=1;
	for(vector<int>::iterator it=to[x].begin();it!=to[x].end();it++)
	{
		if(!dfn[*it]) 
			Tarjan(*it),low[x]=min(low[x],low[*it]);
		else if(f[*it]) low[x]=min(low[x],dfn[*it]);
	}
	if(low[x]==dfn[x])
	{
		cnt++;
		while(f[x])
		{
			int k=st.top();st.pop();
			f[k]=0;be[k]=cnt;
		}
	}
}

int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		int x;scanf("%d",&x);to[i].push_back(x);
	}
	for(int i=1;i<=n;i++)
		if(!dfn[i]) Tarjan(i);
	for(int i=1;i<=n;i++) sum[be[i]]++;
	for(int i=1;i<=cnt;i++) 
		if(sum[i]>1) ans=min(ans,sum[i]);
	printf("%d",ans);
	return 0;
}
posted @ 2017-09-30 16:09  XYZinc  阅读(156)  评论(0编辑  收藏  举报