比赛 图的简单问题 评测结果 AAAAAAAAAE
题目名称 信息传递 最终得分 90
用户昵称 liuyu 运行时间 0.718 s
代码语言 C++ 内存使用 76.60 MiB
提交时间 2017-05-14 20:41:04
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<vector>
#include<stack>
using namespace std;
int n,b,t,cnt=0;
const int N=2000000+3;
vector<int>vec[2000003];
vector<int>vec1[N];
stack<int>sta;
int dfn[N],low[N],insta[N];
int sum[N];
void init()
{
	cin>>n;
	for(int a=1;a<=n;a++)
	 {
	 	scanf("%d",&b);
	 	vec[a].push_back(b);
	 }
	memset(dfn,0,sizeof(dfn));
	memset(low,0x7f,sizeof(low));
	memset(sum,0,sizeof(sum));
	memset(insta,0,sizeof(insta));
}
void dfs(int now)   //初始化 
{
	t++;
	dfn[now]=low[now]=t;
	sta.push(now);
	insta[now]=1;
    for(int i=0;i<vec[now].size();i++)
	  {
	  	int ve=vec[now][i];
	  	if(!dfn[ve])
	  	{
	  		dfs(ve);
	  		low[now]=min(low[now],low[ve]);
		}
		else
		{
			if(insta[ve])low[now]=min(low[now],dfn[ve]);
		}
	   } 
	if(dfn[now]==low[now])
	{
		cnt++;
		
		while(!sta.empty()&&sta.top()!=now)
		{
			insta[sta.top()]=0;
			vec1[cnt].push_back(sta.top());
			sta.pop();
			sum[cnt]++;
		}
		if(!sta.empty())
		{
			vec1[cnt].push_back(sta.top());
			insta[sta.top()]=0;
			sta.pop();
			sum[cnt]++;
		}
	}
}
int main()
{
	freopen("2015message.in","r",stdin);
	freopen("2015message.out","w",stdout);
	init();
	for(int i=1;i<=n;i++)
	 if(!dfn[i])
	 {
	 	t=0;
	 	dfs(i);
	 }
	int MIN=1e9;
	for(int i=1;i<=cnt;i++)
	 if(sum[i]!=1)MIN=min(MIN,sum[i]);
	cout<<MIN;
	return 0;
}