求助10分awa
查看原帖
求助10分awa
965233
_Oxygen_楼主2023/8/10 21:35
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;

#define fore(i, a, n) for (int i = a; i <= n; i ++)
const int N = 200010;
int pre[N], n, dis[N], t;
int lower = 0x3f3f3f3f;

int find(int x){
    if (pre[x] != x) {
    	pre[x] = find(pre[x]);
    	dis[x] += dis[pre[x]]; 
	}
	return pre[x];
}

void check(int a, int b){ 
	// 检查 a 和 b 之间是否有连通边 
	int x = find(a), y = find(b);
	if (find(x) == find(y)){
		lower = min(lower, dis[a] + dis[b] + 1); 
	}
	else{
		pre[x] = y; // 相连两点 
		dis[a] = dis[b] + 1; 
	}
}

int main(){
	//freopen("P2661_2.in", "r", stdin);
	//freopen("output.txt", "w", stdout); 
	cin >> n;
	fore(i, 1, n)
		pre[i] = i;
	
	fore(i, 1, n){
		cin >> t;
		check(i, t);
	}
	
	cout << lower << endl;
	
	
	return 0;
}

2023/8/10 21:35
加载中...