您的位置:首页 > 其它

NOIP2015信息传递 强连通分量 tarjan

2016-08-30 19:47 405 查看
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息