http://codevs.cn/problem/4511/
题面在 ↑ 自己拿。
#include <iostream>
#include <cstdio>
#include <stack>
using namespace std;
struct ha
{
int f,t;
}es[500000];
int tot=0,first[500000],next[500000];
void jt(int f,int t)
{
es[++tot]=(ha){f,t};
next[tot]=first[f];
first[f]=tot;
}
int n;
int zx[500000],tim[500000],siz[500000],bh[500000];
int Tim=0,cnt=0;
stack<int> q;
void dfs(int x)
{
tim[x]=zx[x]=++Tim;
q.push(x);
for(int i=first[x];i!=0;i=next[i])
{
int v=es[i].t;
if(tim[v]==0)
{
dfs(v);
zx[x]=min(zx[x],zx[v]);
}
if(bh[i]==0)
zx[x]=min(zx[x],tim[v]);
}
if(tim[x]==zx[x])
{
cnt++;
while (1)
{
int xx=q.top();
q.pop();
siz[cnt]++;
bh[xx]=cnt;
if(xx==x)
break;
}
}
}
// 信息传递找最小环
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
jt(i,x);
}
for(int i=1;i<=n;i++)
if(tim[i]==0) dfs(i);
int ans=23333333;
for(int i=1;i<=cnt;i++)
if(siz[i]!=1)
ans=min(ans,siz[i]);
cout<<ans;
return 0;
}