就是dfs一遍就行了,找到每一个环。给每一个数赋值一个x,但是如果是这样一个环4->1->2->3->2,一开始遍历了1到2就结束,没有经过4,但是遍历4的时候,因为st[1]=true就结束了,导致w[4]+1-w[1]的答案,是不允许的,况且没有必要走下去了,一开始从遍历的时候就已经找到环了,为避免这种问题,每次遍历x+=n;

#include<bits/stdc++.h>
using namespace std;
int t[200005],w[200005];
long long x=1,ans=0x3f3f3f3f;
bool st[200005];
void dfs(int u){
    if(!st[u]){
        w[u]=x++;
        st[u]=true;
        dfs(t[u]);
    }
    else{
        ans=min(x-w[u],ans);
    }
}
int main(){
    int n; cin>>n;
    for(int i=1;i<=n;i++){
        cin>>t[i];
    }
    for(int i=1;i<=n;i++){
        if(!st[i]){
            dfs(i);
            x+=n;
        }
    }
    cout<<ans;
}