intmain(){ // read input scanf("%d%d%d", &n, &m, &k); for (int i = 1; i <= n; ++i) { fa[i] = i; }
// read connection & create dsu int rx, ry, fx, fy; for (int i = 1; i <= k; ++i) { scanf("%d%d", &rx, &ry); fx = find_fa(rx); fy = find_fa(ry); if (fx != fy) { fa[fx] = fy; } }
// calculate group & convert to dp item for (int i = 1; i <= n; ++i) { ++group_num[find_fa(i)]; } for (int i = 1; i <= n; ++i) { if (group_num[i]) { group[++tot] = group_num[i]; } }
// dp f[0] = 1; for (int i = 1; i <= tot; ++i) { for (int j = 2 * m; j >= group[i]; --j) { f[j] |= f[j - group[i]]; } }
// output answer for (int i = 0; i <= m; ++i) { if (f[m - i]) { printf("%d", m - i); exit(0); } if (f[m + i]) { printf("%d", m + i); exit(0); } }