提交时间:2022-07-19 11:51:28

运行 ID: 52271

#include<bits/stdc++.h> using namespace std; bool dp[10][(1<<15)+5]; int k[10],n,m,len; vector<int> g[20]; int main() { // freopen("subnet.in","r",stdin); // freopen("subnet.out","w",stdout); scanf("%d%d",&n,&m); if(n<=15) { for(int i=1;i<=m;++i) { scanf("%d",&k[i]); for(int j=1;j<=k[i];++j) { int x; scanf("%d",&x); x--; g[i].push_back(x); } } len = (1<<n); dp[0][0] = 1; for(int i=1;i<=m;++i) { for(int S=0;S<len;++S) { if(dp[i-1][S]) { dp[i][S]=1; for(int j=0;j<g[i].size();++j) { for(int l=j+1;l<g[i].size();++l) { int u=g[i][j]; int v=g[i][l]; if((S & (1<<u)) == 0 && (S & (1<<v))==0) { dp[i][(S+(1<<u))+(1<<v)] = 1; } } } } } } int ans=0; for(int S=0;S<len;++S) { int tot=0; if(dp[m][S]) { for(int i=0;i<n;++i) { if(S & (1<<i)) tot++; } } ans=max(ans,tot/2); } printf("%d",ans); } }