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 }
View Code

题目描述

给定m个0~2n-1之间的整数,每一个整数代表一个点,两个整数之间有边当且仅当x&y=0,求无向图有多少联通快(n<=22)

题解

对于一个二进制数x,((1<<n)-1)^x二进制下为0的位数在y&x=0中的y中一定都为0。我们暴力搜索这些数y就行。

 

posted @ 2018-07-28 10:06  Xu-daxia  阅读(181)  评论(0编辑  收藏  举报