关闭

NOIP2015信息传递 强连通分量 tarjan

标签: tarjanNOIP2015强连通分量
214人阅读 评论(0) 收藏 举报
分类:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=200000;
int sum=0;
int begin[maxn],to[2*maxn],next[2*maxn],w[2*maxn],ans[maxn];
int Index,e,top,dfn[maxn],low[maxn],stack[maxn],p[maxn];
inline void tarjan(int x){
	int i;
	dfn[x]=low[x]=++Index;
	stack[++top]=x;
	p[x]=1;
	for(i=begin[x];i;i=next[i]){
		int j=to[i];
		if(!dfn[j]){
			tarjan(j);
			low[x]=min(low[x],low[j]);
		}
		else if(p[j]){
			low[x]=min(low[x],dfn[j]);
		}
	}
	if(dfn[x]==low[x]){
		sum++;
		while(1){
			int tmp=stack[top--];
			ans[sum]++;
			p[tmp]=0;
			if(tmp==x)break;
		}
	}
}
inline void add(int x,int y){
	to[++e]=y;
	next[e]=begin[x];
	begin[x]=e;
}
int main(){
	int i,j,k,m,n;
	scanf("%d",&n);
	for(i=1;i<=n;i++){
		int x;
		scanf("%d",&x);
		add(i,x);
	}
	for(i=1;i<=n;i++)
		if(!dfn[i])
			tarjan(i);
	sort(ans+1,ans+sum+1);
	for(i=1;i<=sum;i++)
		if(ans[i]>1){
			printf("%d\n",ans[i]);return 0;}
	return 0;
}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:229257次
    • 积分:2379
    • 等级:
    • 排名:第15704名
    • 原创:41篇
    • 转载:11篇
    • 译文:0篇
    • 评论:2条
    文章分类
    最新评论