HDU 3006 The Number of set状态压缩

题意:给你N个集合,k个元素,元素值小于等于14,问由这些集合可以构造出多少新的不同集合。。。

算法:

由元素值特别小,可以这样处理。。1,2就是set[i]第1,2位为1

然后把所有集合的合并,枚举。。

最后枚举1..1<<m之间哪些数存在可以组成。。

View Code
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<queue>
using namespace std;
int N, M, set[110];
int dp[1<<15];

void bfs( )
{
  queue<int>q; 
  q.push(0); 
  while( !q.empty())
  {
    int state = q.front( );
    q.pop( );
    for( int i = 1; i <= N; i++)
    {
       int ans = set[i]|state;
       if( !dp[ans] )
       {
         dp[ans]++;
         q.push(ans);
       }
    }
  }
  int sum = 0;
  for( int i = 0; i < (1<<M); i++)
  {
     if( dp[i] )
    sum++;
  }
  printf("%d\n",sum);
}

int main( )
{ 
  int K, t;
  while( scanf("%d%d",&N, &M) != EOF)
  {
     memset(set, 0, sizeof(set));
     memset(dp, 0, sizeof(dp));
     for( int i = 1; i <= N; i++)
     {
        scanf("%d",&K);
        for( int j = 1; j <= K; j++)
        {
           scanf("%d",&t);
           set[i]=set[i] | (1<<(t-1));
        }
     }
     bfs( );
  }  
  return 0;
}

posted on 2012-08-05 10:06  more think, more gains  阅读(173)  评论(0编辑  收藏  举报

导航