题意:判断一个集合是否已经由其他集合构成,也就是留下最小的子集
题解:使用bitset,设置两个bitset变量a,b,使用a记录每个药的集合,使用b记录可由其他药品构成的最终情况
//利用bitset来判断该集合是否已经有其他集合构成 #include<iostream> #include<cstdio> #include<bitset> using namespace std; const int maxn=305; bitset<maxn>a[maxn]; bitset<maxn>b[maxn]; int main() { int n,m,cnt,xu; while(scanf("%d%d",&n,&m)!=EOF&&(n||m)){ for(int i=0;i<m;i++){ a[i]=b[i]=0; } for(int i=0;i<m;i++){ scanf("%d",&cnt); while(cnt--){ scanf("%d",&xu); a[i].set(xu); } for(int j=0;j<i;j++){ if((a[i]&a[j])==a[i]){ b[j]|=a[i]; }else if((a[i]&a[j])==a[j]){ b[i]|=a[j]; } } } int cnt=0; for(int i=0;i<m;i++){ if(a[i]==b[i]){ cnt++; } } printf("%d\n",cnt); } return 0; }