#include <cstdio> #include <vector> #include <cassert> #include <bitset> const int N = 6000; using magia = std::bitset<N>; int t, n, m, k; magia g[N]; int ans; magia ans_mask; void dfs(int c, magia select, magia alive) { if (c > k || c > ans) return; int mx = -1, mxDeg = -1; for (int i = alive._Find_first(); i < n; i = alive._Find_next(i)) { int deg = (alive & g[i]).count(); if (deg == 1) { int j = (alive & g[i])._Find_first(); alive[i] = alive[j] = false; select[j] = true; dfs(c+1, select, alive); return; } if (deg && deg > mxDeg) mx = i, mxDeg = deg; } if (mx == -1) { if (ans > c) { ans = c; ans_mask = select; } else { assert(ans == c); ans_mask |= select; } return; } alive[mx] = false; select[mx] = true; dfs(c + 1, select, alive); select[mx] = false; magia adj = alive & g[mx]; dfs(c+adj.count(), select | adj, alive ^ adj); } signed main() { scanf("%d", &t); while (t--) { scanf("%d%d%d", &n, &m, &k); for(int i = 0; i < m; i++) { int a, b; scanf("%d%d", &a, &b); --a; --b; g[a][b] = g[b][a] = true; } ans = k + 1; magia select, alive; for(int i = 0; i < n; i++) alive[i] = true; dfs(0, select, alive); if (ans != k + 1) for (int i = 0; i < n; ++i) if (!ans_mask[i]) { alive[i] = false; select[i] = true; dfs(1, select, alive); alive[i] = true; select[i] = false; } if (ans == k + 1) printf("-1\n"); else { std::vector<int> odp; for (int i = 0; i < n; ++i) if (ans_mask[i]) odp.push_back(i); printf("%d %d\n", ans, (int)odp.size()); for (int i = 0; i < (int)odp.size(); ++i) printf("%d ", odp[i] + 1); printf("\n"); } for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) g[i][j] = 0; ans_mask = magia(); } return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | #include <cstdio> #include <vector> #include <cassert> #include <bitset> const int N = 6000; using magia = std::bitset<N>; int t, n, m, k; magia g[N]; int ans; magia ans_mask; void dfs(int c, magia select, magia alive) { if (c > k || c > ans) return; int mx = -1, mxDeg = -1; for (int i = alive._Find_first(); i < n; i = alive._Find_next(i)) { int deg = (alive & g[i]).count(); if (deg == 1) { int j = (alive & g[i])._Find_first(); alive[i] = alive[j] = false; select[j] = true; dfs(c+1, select, alive); return; } if (deg && deg > mxDeg) mx = i, mxDeg = deg; } if (mx == -1) { if (ans > c) { ans = c; ans_mask = select; } else { assert(ans == c); ans_mask |= select; } return; } alive[mx] = false; select[mx] = true; dfs(c + 1, select, alive); select[mx] = false; magia adj = alive & g[mx]; dfs(c+adj.count(), select | adj, alive ^ adj); } signed main() { scanf("%d", &t); while (t--) { scanf("%d%d%d", &n, &m, &k); for(int i = 0; i < m; i++) { int a, b; scanf("%d%d", &a, &b); --a; --b; g[a][b] = g[b][a] = true; } ans = k + 1; magia select, alive; for(int i = 0; i < n; i++) alive[i] = true; dfs(0, select, alive); if (ans != k + 1) for (int i = 0; i < n; ++i) if (!ans_mask[i]) { alive[i] = false; select[i] = true; dfs(1, select, alive); alive[i] = true; select[i] = false; } if (ans == k + 1) printf("-1\n"); else { std::vector<int> odp; for (int i = 0; i < n; ++i) if (ans_mask[i]) odp.push_back(i); printf("%d %d\n", ans, (int)odp.size()); for (int i = 0; i < (int)odp.size(); ++i) printf("%d ", odp[i] + 1); printf("\n"); } for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) g[i][j] = 0; ans_mask = magia(); } return 0; } |