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) 编辑 收藏 举报