82 pts求助
  • 板块P2170 选学霸
  • 楼主dhpzy
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/10/4 20:44
  • 上次更新2023/11/2 15:41:20
查看原帖
82 pts求助
1040409
dhpzy楼主2023/10/4 20:44
#include<bits/stdc++.h>
using namespace std;
int n,m,k,f[1000001],dp[1000001],s[1000001],w[1000001],v,minn=INT_MAX,q;
inline int find(int x)
{
	if(f[x]==x) return x;
	return f[x]=find(f[x]);
}
int main()
{
	cin>>n>>m>>k;
	for(int i=1;i<=n;i++) f[i]=i,s[i]=1;
	while(k--)
	{
		int a,b;
		scanf("%d%d",&a,&b);
		if(find(a)==find(b)) continue;
		f[find(a)]=find(b);
		s[b]+=s[a];
	}
	for(int i=1;i<=n;i++)
		if(f[i]==i) w[++v]=s[i];
	for(int i=1;i<=v;i++)
		for(int j=m+m;j>=w[i];j--) dp[j]=max(dp[j],dp[j-w[i]]+w[i]);
	for(int i=1;i<=m+m;i++)
		if(minn>abs(dp[i]-m)) minn=abs(dp[i]-m),q=dp[i];
	cout<<q;
}/*10 4 9
8 2
1 5
5 10
9 7
10 3
3 4
4 6
8 9
6 8*/
2023/10/4 20:44
加载中...