fork download
  1. #include <bits/stdc++.h> // NeOWami
  2. using namespace std;
  3.  
  4. #define ft first
  5. #define sc second
  6.  
  7. const int N = 37;
  8. int n, m, ans = -1;
  9. vector<int> G[N];
  10.  
  11. namespace sub1{
  12. bool TT[N];
  13. bool check() {
  14. for (int i = 1; i <= n; i++) if (!TT[i]) return 0;
  15. return 1;
  16. }
  17. void solve() {
  18. for (int msk = 0; msk < (1 << n); msk++) {
  19. for (int i = 1; i <= n; i++) TT[i] = 0;
  20. for (int i = 1; i <= n; i++) if (msk >> (i - 1) & 1) {
  21. TT[i] = !TT[i];
  22. for (int v: G[i]) TT[v] = !TT[v];
  23. }
  24. if (check()) {
  25. if (ans == -1 || ans > __builtin_popcount(msk)) ans = __builtin_popcount(msk);
  26. }
  27. }
  28. cout << ans;
  29. }
  30. }///
  31.  
  32. namespace subfull{
  33. using ll = long long;
  34. using pli = pair<ll, int>;
  35. int HPT[N][N];
  36. void calc(int left, int right, bool addOne, vector<pli> &Group) {
  37. int len = right - left + 1;
  38. for (int msk = 0; msk < (1 << len); msk++) {
  39. ll mskOfHPT = 0;
  40. for (int i = 1; i <= n; i++) {
  41. int val = (addOne) ? 0 : 1;
  42. for (int light = left; light <= right; light++) if (msk >> (light - left) & 1) {
  43. val = (val + HPT[i][light] * 1) % 2;
  44. }
  45. mskOfHPT |= (val * 1LL << (i - 1));
  46. }
  47. Group.push_back({mskOfHPT, __builtin_popcount(msk)});
  48. }
  49. sort(Group.begin(), Group.end());
  50. }
  51. void solve() {
  52. int mid = n / 2;
  53. for (int i = 1; i <= n; i++) {
  54. HPT[i][i] = 1;
  55. for (int j: G[i]) HPT[i][j] = 1;
  56. }
  57. vector<pli> LeftGroup, RightGroup;
  58. calc(1, mid, 0, LeftGroup);
  59. calc(mid + 1, n, 1, RightGroup);
  60. for (pli item: LeftGroup) {
  61. int id = lower_bound(RightGroup.begin(), RightGroup.end(), (pli){item.ft, -1}) - RightGroup.begin();
  62. if (id < RightGroup.size() && item.ft == RightGroup[id].ft) {
  63. int sum = item.sc + RightGroup[id].sc;
  64. if (ans == -1 || ans > sum) ans = sum;
  65. }
  66. }
  67. cout << ans;
  68. }
  69. }///
  70.  
  71. signed main() {
  72. cin.tie(NULL)->sync_with_stdio(false);
  73. if(ifstream("Input.inp")) {
  74. freopen("Input.inp", "r", stdin);
  75. freopen("Output.out", "w", stdout);
  76. }
  77. cin >> n >> m;
  78. for (int i = 1; i <= m; i++) {
  79. int u, v; cin >> u >> v;
  80. G[u].push_back(v);
  81. G[v].push_back(u);
  82. }
  83.  
  84. // if (n <= 21) return sub1::solve(), 0;
  85. return subfull::solve(), 0;
  86. return 0;
  87. }
Success #stdin #stdout 0.01s 5324KB
stdin
Standard input is empty
stdout
Standard output is empty