CF 986C AND Graph(建模+DFS)
1 #include<stdio.h> 2 bool ex[4194304],v[4194304]; 3 int a[4194305],n,al; 4 void dfs(int x){ 5 if(v[x])return; 6 v[x]=1; 7 if(ex[x])dfs(al^x); 8 for(int i=0;i<n;i++){ 9 if(x>>i&1)dfs(x^(1<<i)); 10 } 11 } 12 int main(){ 13 int m,i,ans; 14 scanf("%d%d",&n,&m); 15 al=(1<<n)-1; 16 for(i=1;i<=m;i++){ 17 scanf("%d",a+i); 18 ex[a[i]]=1; 19 } 20 ans=0; 21 for(i=1;i<=m;i++){ 22 if(!v[a[i]]){ 23 dfs(al^a[i]); 24 ans++; 25 } 26 } 27 printf("%d",ans); 28 }
题目描述
给定m个0~2n-1之间的整数,每一个整数代表一个点,两个整数之间有边当且仅当x&y=0,求无向图有多少联通快(n<=22)
题解
对于一个二进制数x,((1<<n)-1)^x二进制下为0的位数在y&x=0中的y中一定都为0。我们暴力搜索这些数y就行。