fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define faster ios_base::sync_with_stdio(false); cin.tie(NULL)
  5. #define fi first
  6. #define se second
  7. #define ll long long
  8. #define ii pair<int,int>
  9. #define BIT(mask, i) ((mask >> i) & 1)
  10. #define c_BIT(mask) __builtin_popcount(mask)
  11.  
  12. const int N = 605;
  13.  
  14. int T, n, m, k;
  15. vector<int> adj[N];
  16. bool found;
  17. vector<int> ans;
  18.  
  19. bool is_adj(int u, int v) {
  20. return binary_search(adj[u].begin(), adj[u].end(), v);
  21. }
  22.  
  23. void BronKerbosch(vector<int> R, vector<int> P, vector<int> X) {
  24. if (found) return;
  25. if ((int)R.size() == k) {
  26. ans = R;
  27. found = true;
  28. return;
  29. }
  30. if ((int)R.size() + (int)P.size() < k) return;
  31. if (P.empty() && X.empty()) return;
  32.  
  33. int u = -1;
  34. if (!P.empty()) u = P[0];
  35. else if (!X.empty()) u = X[0];
  36.  
  37. vector<int> candidates;
  38. if (u == -1) candidates = P;
  39. else {
  40. unordered_set<int> neigh(adj[u].begin(), adj[u].end());
  41. for (int v : P) if (!neigh.count(v)) candidates.push_back(v);
  42. }
  43.  
  44. for (int v : candidates) {
  45. if (found) return;
  46. vector<int> newR = R;
  47. newR.push_back(v);
  48.  
  49. vector<int> newP, newX;
  50. for (int u : P)
  51. if (is_adj(u, v)) newP.push_back(u);
  52. for (int u : X)
  53. if (is_adj(u, v)) newX.push_back(u);
  54.  
  55. BronKerbosch(newR, newP, newX);
  56.  
  57. P.erase(find(P.begin(), P.end(), v));
  58. X.push_back(v);
  59. }
  60. }
  61.  
  62. void solve() {
  63. while (T--) {
  64. cin >> n >> m >> k;
  65. for (int i = 1; i <= n; i++) adj[i].clear();
  66.  
  67. for (int i = 0; i < m; i++) {
  68. int u, v; cin >> u >> v;
  69. adj[u].push_back(v);
  70. adj[v].push_back(u);
  71. }
  72. for (int i = 1; i <= n; i++) sort(adj[i].begin(), adj[i].end());
  73.  
  74. found = false; ans.clear();
  75. vector<int> R, P, X;
  76. for (int i = 1; i <= n; i++) P.push_back(i);
  77.  
  78. BronKerbosch(R, P, X);
  79.  
  80. if (!found) cout << -1 << '\n';
  81. else {
  82. sort(ans.begin(), ans.end());
  83. for (int i = 0; i < (int)ans.size(); i++)
  84. cout << ans[i] << (i + 1 == (int)ans.size() ? '\n' : ' ');
  85. }
  86. }
  87. }
  88.  
  89. void inp() {
  90. cin >> T;
  91. }
  92.  
  93. int main() {
  94. faster;
  95. inp();
  96. solve();
  97. return 0;
  98. }
  99.  
Success #stdin #stdout 0s 5320KB
stdin
Standard input is empty
stdout
Standard output is empty