AC

许诺  •  7天前


#include <iostream>
#include <vector>
#include <bitset>
#include <cmath>
#include <algorithm>

using namespace std; const int MAXN = 20005; int parent[MAXN]; int sizeComp[MAXN]; int find(int x) {

if (parent[x] != x) {
    parent[x] = find(parent[x]);
}
return parent[x];

} void unionSets(int a, int b) {

a = find(a);
b = find(b);
if (a != b) {
    if (sizeComp[a] < sizeComp[b]) {
        swap(a, b);
    }
    parent[b] = a;
    sizeComp[a] += sizeComp[b];
}

} int main() {

int n, k, m;
cin >> n >> k >> m;
for (int i = 1; i <= n; i++) {
    parent[i] = i;
    sizeComp[i] = 1;
}
for (int i = 0; i < k; i++) {
    int a, b;
    cin >> a >> b;
    unionSets(a, b);
}
vector<int> groups;
for (int i = 1; i <= n; i++) {
    if (parent[i] == i) {
        groups.push_back(sizeComp[i]);
    }
}
bitset<MAXN> dp;
dp[0] = 1;
for (int s : groups) {
    dp |= (dp << s);
}
int best = 0;
int minDiff = n;
for (int i = 0; i <= n; i++) {
    if (dp[i]) {
        int diff = abs(i - m);
        if (diff < minDiff) {
            minDiff = diff;
            best = i;
        } else if (diff == minDiff) {
            if (i < best) {
                best = i;
            }
        }
    }
}
cout << best << endl;
return 0;

}


评论:

请先登录,才能进行评论