根据题解写的,用路径压缩,刚学两个小时,还不熟练,大佬看看还有什么优化的地方
查看原帖
根据题解写的,用路径压缩,刚学两个小时,还不熟练,大佬看看还有什么优化的地方
1240428
Sa_Zhi楼主2024/3/25 22:09
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl "\n"
#define INF 0x3f3f3f3f
#define PII <int, int>
const int MAX = 2e6+6;
int n,T,fa[MAX],D[MAX],sum=0,ans=INF; //D记录两个点的距离,因为使用路径压缩后,每条路径的长度是不同的 
void init(int n){
	for(int i=1; i<=n; i++){
		fa[i] = i;
	}
}
int find(int i, int x){
	int SUM = sum; //记录i时的当前长度 
	sum+=D[i];
	if(fa[x] == x){
		return x;
	}else{
		fa[i] = find(x,fa[x]);
		D[i] = sum-SUM; 
		return fa[fa[i]];
	}
}
signed main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n;
	init(n);
	for(int i=1; i<=n; i++){
		D[i] = 1;
	}
	for(int i=1; i<=n; i++){
		cin>>T;
		sum=0;
		if(find(i,T) == i){
			ans = min(ans,sum);
		}else if(fa[i]==i){ //如果不能形成一个环就把两点相连 
			fa[i] = T;
		}
	}
	cout<<ans;
	return 0;
} 
2024/3/25 22:09
加载中...