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
| #include <cstdio> #include <vector> #define eb emplace_back #include <bitset> using namespace std; template <class Type> void read (Type &x) { char c; bool flag = false; while ((c = getchar()) < '0' || c > '9') c == '-' && (flag = true); x = c - '0'; while ((c = getchar()) >= '0' && c <= '9') x = (x << 1) + (x << 3) + c - '0'; flag && (x = ~x + 1); } template <class Type, class ...rest> void read (Type &x, rest &...y) { read(x), read(y...); } template <class Type> void write (Type x) { x < 0 && (putchar('-'), x = ~x + 1); x > 9 && (write(x / 10), 0); putchar('0' + x % 10); } const int N = 510; int n, m, f[N]; bool g[N][N]; vector <int> st[N]; bitset <N> ans; bool dfs (bitset <N> cur) { int k = cur.count(), sz = st[k].size(); if (!sz) { if (k > ans.count()) return ans = cur, true; return false; } for (int i = 0; i < sz; i++) { int t = st[k][i]; if (min(sz - i + k, f[t] + k) <= ans.count()) return false; st[k + 1].clear(); for (int j = i + 1; j < sz; j++) if (g[t][st[k][j]]) st[k + 1].eb(st[k][j]); cur.set(t); bool flag = dfs(cur); cur.reset(t); if (flag) return true; } return false; } int main() { read(n, m); for (int a, b; m; --m) read(a, b), g[a][b] = g[b][a] = 1; for (int i = n; i >= 1; i--) { st[1].clear(); for (int j = i + 1; j <= n; j++) if (g[i][j]) st[1].eb(j); bitset <N> t; t.set(i); dfs(t); f[i] = ans.count(); } write(ans.count()), puts(""); for (int i = 1; i <= n; ++i) if (ans[i]) write(i), putchar(' '); return 0; }
|