很简单的题目,将集合压缩成一个数,两重循环搞定。
ACcode:
#include<cstdio>
#include<cstring>
const int NS=15;
int n,m,k,t;
int v[1<<NS],a[111];
int main()
{
while (~scanf("%d%d",&n,&m))
{
for (int i=0;i<n;i++)
{
scanf("%d",&k);
a[i]=0;
for (int j=0;j<k;j++)
scanf("%d",&t),a[i]|=(1<<(t-1));
}
memset(v,0,sizeof(v));
v[0]=1;
int ans=-1,lim=1<<m;
for (int i=0;i<lim;i++)
{
for (int j=0;j<n;j++)
v[i|a[j]]|=v[i];
ans+=v[i];
}
printf("%d\n",ans);
}
return 0;
}