63pts求助
查看原帖
63pts求助
1258467
hao12345ia楼主2024/7/11 15:05
#include<bits/stdc++.h>
using namespace std;
int n,m,k;
int fa[20001];
int a[20001],p[20001];
int f[40001];
int find(int x){
	if(fa[x]==x){
		return x;
	}
	return fa[x]=find(fa[x]);
}
void join(int x,int y){
	if(find(x)==find(y)){
		return ;
	}
	fa[find(y)]=find(x);
	p[find(x)]+=p[find(y)];
}
int main(){
	scanf("%d%d%d",&n,&m,&k);
	for(int i=1;i<=n;i++){
		fa[i]=i;
		p[i]=1;
	}
	for(int i=1;i<=k;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		join(x,y);
	}
	int tot=0;
	for(int i=1;i<=n;i++){
		if(fa[i]==i){
			tot++;
			a[tot]=p[i];
		}
	}
	for(int i=1;i<=tot;i++){
		for(int j=2*m;j>=a[i];j--){
			f[j]=max(f[j],f[j-a[i]]+a[i]);
		}
	}
	int best=999999,ans=999999;
	for(int i=1;i<=2*m;i++){
		if(best==abs(f[i]-m)){
			ans=min(f[i],ans);
		}
		else if(best>abs(f[i]-m)){
			best=abs(f[i]-m);
			ans=f[i];
		}
	}
	if(ans==999999){
		printf("0");
	}
	else{
		printf("%d",ans);
	}
}
2024/7/11 15:05
加载中...