題意
在有 \(\ n\) 條邊的圖中找最短路
題解
並查集,維護父親及路徑長度
調試記錄
無
#include <cstdio>
#include <algorithm>
#define maxn 200005
#define INF 0x3f3f3f3f
using namespace std;
int n, ans = INF, f[maxn], dis[maxn];
int getf(int x){
if (x == f[x]) return x;
else{
int tmp = f[x];
f[x] = getf(f[x]);
dis[x] += dis[tmp];
return f[x];
}
}
void Union(int x, int y){
int u = getf(x), v = getf(y);
if (u != v){
f[u] = v;
dis[x] = dis[y] + 1;
}
if (u == v){
ans = min(ans, dis[x] + dis[y] + 1);
}
}
int main(){
scanf("%d", &n);
for (int i = 1; i <= n; i++) f[i] = i;
for (int a, i = 1; i <= n; i++){
scanf("%d", &a);
Union(i, a);
}
printf("%d\n", ans);
return 0;
}