最小环一定要写do while+手写栈
不然会炸(至少洛谷是这样的,什么wa,te都有)
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#define maxn 200002
using namespace std;
int n,next[maxn],to[maxn],st[maxn],dfn[maxn],low[maxn],topt,ans=maxn,top,sta[maxn];
bool f[maxn];
void add(int x,int y)
{
to[++topt]=y;
next[topt]=st[x];
st[x]=topt;
}
void tarjan(int x)
{
f[x]=1; sta[++top]=x;
dfn[x]=low[x]=++topt;
int p=st[x];
while (p)
{
if (!dfn[to[p]])
{tarjan(to[p]); low[x]=min(low[x],low[to[p]]);}
else if (f[to[p]]) low[x]=min(low[x],dfn[to[p]]);
p=next[p];
}
if (dfn[x]==low[x])
{
int ansnow=0;
do
{
f[sta[top]]=0;
ansnow++;
}while(sta[top--]!=x);
if (ansnow!=1) ans=min(ans,ansnow);
}
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
{int xx; scanf("%d",&xx); add(i,xx);}
for (int i=1;i<=n;i++)
if (!dfn[i]) tarjan(i);
printf("%d",ans);
return 0;
}