RE 9分蒟蒻求助
  • 板块P2170 选学霸
  • 楼主zzb1217
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/9/12 09:53
  • 上次更新2023/11/2 21:14:38
查看原帖
RE 9分蒟蒻求助
746761
zzb1217楼主2023/9/12 09:53
#include<bits/stdc++.h>
using namespace std;
int fa[20005],num[20005],qwq[20005],len=0,dp[20005];
inline int find(int x)
{
	if (fa[x]==x)
	{
		return x;
	}
	fa[x]=find(fa[x]);
}
int main()
{
	int n,m,k;
	cin >> n >> m >> k;
	for (int i=1;i<=n;++i) 
	{
	    fa[i]=i,num[i]++;
	}
	for (int i=1;i<=k;++i)
	{
		int x,y;
		cin >> x >> y;
		if (find(x)!=find(y))
		{
			fa[y]=x;
			num[x]+=num[y];
		}
	}
	for (int i=1;i<=n;++i)
	{
		if (fa[i]==i)
		{
			qwq[++len]+=num[i];
		}
	}
	for(int i=1;i<=n;++i)
    {
        for(int j=n;j>=qwq[i];--j)
        {
            dp[j]=max(dp[j],dp[j-qwq[i]]+qwq[i]);
        }
    }
    int minn=abs(m-dp[m+1]);
    for(int i=m+1;i<=n;++i)
    {
        minn=min(minn,abs(m-dp[i]));
    }
    if(minn<abs(m-dp[m]))
	{
		cout << m+minn;
	}
    else 
	{
		cout << dp[m] << endl;
	}
	return 0;
}
2023/9/12 09:53
加载中...