Codeforces Round #485 (Div. 1) C - AND Graph
阿新 • • 發佈:2020-12-06
用了很神奇的辦法,對於每一個數,取反,暴力找它所有子集,如果dfs到的數字又是我們輸入的數字,就繼續取反暴力找子集
#include <bits/stdc++.h> using namespace std; const int N = (1 << 23) + 10; int a[N]; bool vis[N]; int flag[N]; int n, m; void dfs(int u) { //printf("%d\n", u); vis[u] = true; if (flag[u] == 1 && !vis[u ^ ((1 << (n + 1)) - 1)]) dfs(u ^ ((1 << (n + 1)) - 1)); for (int i = 0; i <= n; i++) if ((u & (1 << i)) && !vis[u - (1 << i)]) dfs(u - (1 << i)); } int main() { scanf("%d %d", &n, &m); int ans = 0; for (int i = 1; i <= m; i++) { scanf("%d", &a[i]); flag[a[i]] = 1; } for (int i = 1; i <= m; i++) { if (vis[a[i]]) continue; flag[a[i]] = 2; dfs(a[i] ^ ((1 << (n + 1)) - 1)); ans++; } printf("%d\n", ans); return 0; }