这是源代码
#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]);
}