AFO

CF986C

CF986C

\(A_i\)连一条向补集的边和子集的边,然后dfs求联通块数


#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>

using namespace std;

const int M = 7000001;
int n,m,k,f[M],s[25],N,g[M],d[M],a[M];

void dfs(int x)
{
	if(f[x]) return ;
	f[x]=1;
	if(g[x]) dfs((1<<n)-1-x); 
	
	for(int i=0;i<=n;i++) if(x&(1<<i)) dfs(x-(1<<i));
}

int main()
{
	scanf("%d%d",&n,&m);// N=m;
	for(int i=1;i<=m;i++)
	{
		scanf("%d",&a[i]);
		g[a[i]]=1;//g[(1<<n)-1-a[i]]=1;
	}
	
	for(int i=1;i<=m;i++) 
		if(!f[a[i]]) dfs((1<<n)-1-a[i]),N++; 
	printf("%d",N);
}
posted @ 2019-09-23 10:07  ZUTTER☮  阅读(347)  评论(0编辑  收藏  举报