#include <bits/stdc++.h>
using namespace std;
constexpr int N = 1010, M = 3030;
int n, m, k, deg[N], use[N], ok[N];
int ans, flag;
vector<int> G[N];
void del(int u) {
use[u] = 1;
for(auto v : G[u]) deg[v] --;
}
void add(int u) {
use[u] = -1;
for(auto v : G[u]) deg[v] ++;
}
void dfs(int k) {
if(k > ans) return ;
int mx = 0, p = -1;
for(int i = 1; i <= n; i ++) if(!~use[i] && deg[i]) {
if(deg[i] > mx) mx = deg[i], p = i;
}
if(mx <= 2) {
static int last[N];
memcpy(last, use, n + 1 << 2);
static int vis[N], ts = 0, sum[N];
ts ++;
for(int i = 1; i <= n; i ++) if(!~last[i] && deg[i] && vis[i] != ts) {
static int que[N], hh, tt;
que[hh = 1] = i; tt = 1;
vis[i] = ts;
int _n = 0, _m = 0;
while(hh <= tt) {
int u = que[hh ++];
_n ++; sum[u] = 0;
for(auto v : G[u]) if(!~use[v]) {
if(vis[v] != ts) que[++ tt] = v, vis[v] = ts;
_m ++; sum[u] += v;
}
}
_m >>= 1;
if(_n == _m) {
k += _n + 1 >> 1;
for(int i = 1; i <= _n; i ++) {
use[que[i]] = 1;
}
} else {
assert(_m == _n - 1);
k += _n >> 1;
if(_n & 1) {
int p = -1;
for(int i = 1; i <= _n; i ++) if(deg[que[i]] == 1) p = que[i];
for(int i = 1, q = 0, tmp; i <= _n; i ++, tmp = q, q = p, p = sum[p] - tmp) {
if(1 + i & 1) use[p] = 1;
}
} else {
for(int i = 1; i <= _n; i ++) {
use[que[i]] = 1;
}
}
}
}
if(k == ans) {
flag = 1;
for(int i = 1;i <= n; i ++) ok[i] = use[i] == 1 ? 1 : ok[i];
} else if(k < ans) {
ans = k; flag = 1;
for(int i = 1; i <= n; i ++) ok[i] = use[i] == 1 ? 1 : 0;
}
memcpy(use, last, n + 1 << 2);
return ;
}
if(p == -1) {
flag = 1;
if(k == ans) {
for(int i = 1; i <= n; i ++) ok[i] = use[i] == 1 ? 1 : ok[i];
} else {
ans = k;
for(int i = 1; i <= n; i ++) ok[i] = use[i] == 1 ? 1 : 0;
}
return ;
}
del(p);
dfs(k + 1);
use[p] = 0;
vector<int> t;
for(auto v : G[p]) if(!~use[v]) del(v), t.emplace_back(v);
dfs(k + t.size());
add(p);
for(auto v : t) add(v);
}
void solve() {
cin >> n >> m >> k;
fill(use + 1, use + n + 1, 0);
for(int i = 1; i <= m; i ++) {
int u, v;
cin >> u >> v;
G[u].emplace_back(v);
G[v].emplace_back(u);
deg[u] ++, deg[v] ++;
use[u] = use[v] = -1;
}
ans = k, flag = 0;
dfs(0);
if(flag) {
cout << ans << ' ' << accumulate(ok + 1, ok + n + 1, 0) << '\n';
for(int i = 1; i <= n; i ++) if(ok[i]) cout << i << ' ';
cout << '\n';
} else {
cout << -1 << '\n';
}
}
void clear() {
for(int i = 1; i <= n; i ++) ok[i] = deg[i] = 0, use[i] = -1, G[i].clear();
}
int main() {
// freopen("in.txt", "r", stdin);
ios::sync_with_stdio(false), cin.tie(0);
int T;
for(cin >> T; T; T --) {
solve();
clear();
}
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 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 | #include <bits/stdc++.h> using namespace std; constexpr int N = 1010, M = 3030; int n, m, k, deg[N], use[N], ok[N]; int ans, flag; vector<int> G[N]; void del(int u) { use[u] = 1; for(auto v : G[u]) deg[v] --; } void add(int u) { use[u] = -1; for(auto v : G[u]) deg[v] ++; } void dfs(int k) { if(k > ans) return ; int mx = 0, p = -1; for(int i = 1; i <= n; i ++) if(!~use[i] && deg[i]) { if(deg[i] > mx) mx = deg[i], p = i; } if(mx <= 2) { static int last[N]; memcpy(last, use, n + 1 << 2); static int vis[N], ts = 0, sum[N]; ts ++; for(int i = 1; i <= n; i ++) if(!~last[i] && deg[i] && vis[i] != ts) { static int que[N], hh, tt; que[hh = 1] = i; tt = 1; vis[i] = ts; int _n = 0, _m = 0; while(hh <= tt) { int u = que[hh ++]; _n ++; sum[u] = 0; for(auto v : G[u]) if(!~use[v]) { if(vis[v] != ts) que[++ tt] = v, vis[v] = ts; _m ++; sum[u] += v; } } _m >>= 1; if(_n == _m) { k += _n + 1 >> 1; for(int i = 1; i <= _n; i ++) { use[que[i]] = 1; } } else { assert(_m == _n - 1); k += _n >> 1; if(_n & 1) { int p = -1; for(int i = 1; i <= _n; i ++) if(deg[que[i]] == 1) p = que[i]; for(int i = 1, q = 0, tmp; i <= _n; i ++, tmp = q, q = p, p = sum[p] - tmp) { if(1 + i & 1) use[p] = 1; } } else { for(int i = 1; i <= _n; i ++) { use[que[i]] = 1; } } } } if(k == ans) { flag = 1; for(int i = 1;i <= n; i ++) ok[i] = use[i] == 1 ? 1 : ok[i]; } else if(k < ans) { ans = k; flag = 1; for(int i = 1; i <= n; i ++) ok[i] = use[i] == 1 ? 1 : 0; } memcpy(use, last, n + 1 << 2); return ; } if(p == -1) { flag = 1; if(k == ans) { for(int i = 1; i <= n; i ++) ok[i] = use[i] == 1 ? 1 : ok[i]; } else { ans = k; for(int i = 1; i <= n; i ++) ok[i] = use[i] == 1 ? 1 : 0; } return ; } del(p); dfs(k + 1); use[p] = 0; vector<int> t; for(auto v : G[p]) if(!~use[v]) del(v), t.emplace_back(v); dfs(k + t.size()); add(p); for(auto v : t) add(v); } void solve() { cin >> n >> m >> k; fill(use + 1, use + n + 1, 0); for(int i = 1; i <= m; i ++) { int u, v; cin >> u >> v; G[u].emplace_back(v); G[v].emplace_back(u); deg[u] ++, deg[v] ++; use[u] = use[v] = -1; } ans = k, flag = 0; dfs(0); if(flag) { cout << ans << ' ' << accumulate(ok + 1, ok + n + 1, 0) << '\n'; for(int i = 1; i <= n; i ++) if(ok[i]) cout << i << ' '; cout << '\n'; } else { cout << -1 << '\n'; } } void clear() { for(int i = 1; i <= n; i ++) ok[i] = deg[i] = 0, use[i] = -1, G[i].clear(); } int main() { // freopen("in.txt", "r", stdin); ios::sync_with_stdio(false), cin.tie(0); int T; for(cin >> T; T; T --) { solve(); clear(); } return 0; } |
English