第一个点被卡,求助
查看原帖
第一个点被卡,求助
918894
XyGetItRightAker楼主2023/9/3 11:53

这是源代码

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
int n, m, k;
int bing[20004];
int val[20004];
// 对于k对人,要么都选,要么都不选
int dp[20004]; // 选i个人能选的不冲突的最大人数
int find(int i);
void init();
int main()
{
	cin >> n >> m >> k;
	init();
	memset(val, 0, sizeof(val));
	memset(dp, 0, sizeof(dp));
	for (int i = 1; i <= k; i++)
	{
		int a, b;
		cin >> a >> b;
		int x = find(a), y = find(b);
		if (x != y)
		{
			bing[x] = y;
		}
	}
	for (int i = 1; i <= n; i++)
	{
		val[find(i)]++;
	}
	for (int i = 1; i <= n; i++)
	{
		if (!val[i])
			continue;
		for (int j = n; j >= val[i]; j--)
		{
			dp[j] = max(dp[j], dp[j - val[i]] + val[i]);
		}
	}
	int ans = 0, cnt = 1000000000;
	for (int i = 1; i <= n; i++)
	{
		if (abs(m - dp[i]) < cnt)
		{
			ans = dp[i];
			cnt = abs(m - dp[i]);
		}
	}
	cout << ans;
	return 0;
}
void init()
{
	for (int i = 1; i <= n; i++)
	{
		bing[i] = i;
	}
}
int find(int i)
{
	if (bing[i] == i)
		return i;
	else
		return bing[i] = find(bing[i]);
}
2023/9/3 11:53
加载中...