第一个点被卡了,O2才过,求解释
查看原帖
第一个点被卡了,O2才过,求解释
285617
黑影洞人楼主2022/7/11 21:24

轻压

#include<cstdio>
#include<algorithm>
#define int long long
#define N 114514
using namespace std;
int tot,n,m,k,f[N],size[N],dp[N],val[N],ans=2147483647;
int find(int x){return x==f[x]?x:f[x]=find(f[x]);}
void combine(int x,int y){x=find(x),y=find(y);if(x==y)return;f[x]=y;size[y]+=size[x];size[x]=0;}
signed main(){
	scanf("%lld%lld%lld",&n,&m,&k);
	for(int i=1;i<=n;i++)f[i]=i,size[i]=1;
	for(int i=1;i<=k;i++){int a,b;scanf("%lld%lld",&a,&b);combine(a,b);}
	for(int i=1;i<=n;i++)if(size[i])val[++tot]=size[i];
	for(int i=1;i<=tot;i++)for(int j=2*m;j>=val[i];j--)dp[j]=max(dp[j],dp[j-val[i]]+val[i]);
	int mnp=2147483647;
	for(int i=1;i<=2*m;i++){
		if(mnp==abs(dp[i]-m))ans=min(ans,dp[i]);
		if(mnp>abs(dp[i]-m))mnp=abs(dp[i]-m),ans=dp[i];
	}
	if(ans==2147483647)return puts("0"),0;
	printf("%lld",ans);
	return 0;
}



2022/7/11 21:24
加载中...