rt,求最小环做法,时间复杂度 O(N) 应该很稳吧/yiw
#include<bits/stdc++.h>
using namespace std;
int n,a[200001];
bool k[200001];
int ans=INT_MAX;
inline int read()
{
int x=0;
char c=getchar();
for(; c<'0' || c>'9'; c=getchar());
for(; c<='9' && c>='0'; c=getchar())
x=(x<<3)+(x<<1)+c-'0';
return x;
}
int huan(int x)
{
int sum=1,xx=a[x];
while(xx!=x)
{
sum++;
xx=a[xx];
}
return sum;
}
int main()
{
int x;
cin>>n;
for(int i=1; i<=n; i++)
a[i]=read();
for(int i=1; i<=n; i++)
{
if(k[i]==0)
{
x=a[i];
while(1)
{
k[x]=1;
x=a[x];
if(k[x]==1)
{
ans=min(ans,huan(x));
break;
}
}
}
}
cout<<ans;
return 0;
}