提交时间:2022-07-19 13:05:57

运行 ID: 52564

#include<cstdio> #include<vector> #include<cstring> #define rep(a,b,c) for(int c(a);c<=(b);++c) inline int read() { int res=0;char ch=getchar();while(ch<'0'||ch>'9')ch=getchar(); while(ch<='9'&&ch>='0')res=res*10+(ch^48),ch=getchar();return res; } const int N=8010;std::vector<int> G[N];int n,m; namespace Sub0 { bool vis[10];int ans; inline void dfs(int p,int w=0) { if(p>m){w>ans?ans=w:0;return;} for(unsigned i=0;i<G[p].size();++i) { for(unsigned j=i+1;j<G[p].size();++j) { if(!vis[G[p][i]]&&!vis[G[p][j]]) { vis[G[p][i]]=vis[G[p][j]]=true; dfs(p+1,w+1); vis[G[p][i]]=vis[G[p][j]]=false; } } } dfs(p+1,w); } inline void mian(){dfs(1);printf("%d\n",ans);} } namespace Sub1 { const int INF=0x3f3f3f3f;int dp[10][1<<15|7],ans=0; template<typename T> inline T max(const T&x,const T&y){return x<y?y:x;} inline void mian() { memset(dp,~0x3f,sizeof(dp));dp[0][0]=0; rep(1,m,i) { for(int S=0;S<(1<<n);++S)dp[i][S]=dp[i-1][S]; for(unsigned p1=0;p1<G[i].size();++p1) { int u=G[i][p1]-1; for(unsigned p2=p1+1;p2<G[i].size();++p2) { int v=G[i][p2]-1; for(int S=0;S<(1<<n);++S)if((S>>u&1)&&(S>>v&1)) { dp[i][S]=max(dp[i][S],dp[i-1][S^(1<<u)^(1<<v)]+1); ans=max(ans,dp[i][S]); } } } } printf("%d\n",ans);return; } } int main() { n=read();m=read();bool flag=false; rep(1,m,i) { int k=read();if(k!=2)flag=true; while(k--)G[i].push_back(read()); } if(n<=8&&m<=5)return Sub0::mian(),0; if(n<=15&&m<=8)return Sub1::mian(),0; printf("%d\n",n>>1); }