HDU 3006
这题就是用一个二进制数保存一个集合的元素 比如一个集合中有两个元素 1 3 那就用5 (101)表示这个集合
就是用0 1 来表示这个集合中一个数存不存在 再比如 一个集合有 三个元素 1 4 5 就在这几个位子上标为1,那就
用25 (11001)来表示这个集合!在借助于位运算的或( | )就可已达到合并集合的目的,比如一个集合(1 4 )
和一个集合(1 2 3)进行合并 那就是 (9)1001 | 111(7)=1111 就是15 这样就将重复的部分覆盖了。新的集合就用15来表示!最大就是(11111111111111)2^15-1来表示一个集合!
#include<stdio.h>
#include<string.h>
int a[1<<15];
int main()
{
int n,k,y,m,x,ans,i;
while(scanf("%d %d",&n,&m)!=EOF)
{
memset(a,0,sizeof(a));
ans=0;
while(n--)
{
scanf("%d",&k);y=0;
while(k--)
{
scanf("%d",&x);
y=y|(1<<(x-1));// 把每一个集合所代表的值算出来!
}
//用循环 或运算进行集合合并!
a[y]=1;
for(i=0;i<=(1<<14);i++)
if(a[i])
a[ i | y ]=1; }
for(i=0;i<=(1<<14);i++)
if(a[i])
ans++;
printf("%d\n",ans);
}
return 0;
}
这题不是自己做的事别人的思路