题目链接:https://www.luogu.org/problem/P2661
思路:如果有两个点祖先节点相同,那么就可以构成一个环,长度为两个点到祖先节点长度之和+1,新加入的一条边的两个端点在并查集中同祖先,则一定成环 。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
const int N = 2e5 + 7;
int n, x, cnt, ans, f[N];
void init(){ans = inf; for(int i = 1; i <= n; i++) f[i] = i;}
int findd(int x, int &cnt) {cnt++; return f[x] == x ? x : findd(f[x], cnt);}
int main()
{
scanf("%d", &n); init();
for(int i = 1; i <= n; i++)
{
scanf("%d", &x); cnt = 0;
if(findd(x, cnt) == i) ans = min(ans, cnt);
else f[i] = x;
}
printf("%d\n", ans);
}