zoukankan      html  css  js  c++  java
  • 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就行。

  • 相关阅读:
    迪杰斯特拉(Dijkstra)算法描述及理解
    KMP初步
    网络流初步
    Cutting Codeforces Round #493 (Div. 2)
    优先队列小结
    树状数组初步理解
    分块思想
    树状数组-逆序对-HDU6318
    线段树
    8.12.5
  • 原文地址:https://www.cnblogs.com/Xu-daxia/p/9380830.html
Copyright © 2011-2022 走看看