1. 程式人生 > 實用技巧 >Codeforces Round #485 (Div. 1) C - AND Graph

Codeforces Round #485 (Div. 1) C - AND Graph

用了很神奇的辦法,對於每一個數,取反,暴力找它所有子集,如果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; }