提交时间:2022-07-19 11:54:38

运行 ID: 52338

#include<bits/stdc++.h> #define il inline using namespace std; const int maxm=4410; const int maxn=8010; const int maxk=43; il int read(){ int x=0; char c=getchar(); for(;!(c>='0'&&c<='9');c=getchar()); for(;c>='0'&&c<='9';c=getchar()) x=(x<<1)+(x<<3)+c-'0'; return x; } struct edge{ int v,to; }e[maxm*maxk*maxk]; int head[maxn],ecnt; void addedge(int u,int v){ e[++ecnt].v=v,e[ecnt].to=head[u],head[u]=ecnt; } bool vis[maxn],Vis[maxn][maxn],In[maxn]; int label[maxn],loc[maxn]; int st[maxn],top; int n,m,ans,b[maxk]; vector<int>v; bool cmp(int x,int y){return (label[x]^label[y])?label[x]<label[y]:x<y;} void MCS(){ for(int i=1;i<=n;i++) v.push_back(i); while(!v.empty()){ st[++top]=v[v.size()-1],loc[v[v.size()-1]]=top; In[v[v.size()-1]]=1,v.pop_back(); for(int i=head[st[top]];i;i=e[i].to) if(!In[e[i].v]){ v.erase(lower_bound(v.begin(),v.end(),e[i].v,cmp)),label[e[i].v]++; v.insert(upper_bound(v.begin(),v.end(),e[i].v,cmp),e[i].v); } } } int main(){ int x,Max,id; n=read(),m=read(); for(int i=1;i<=m;i++){ x=read(); for(int j=1;j<=x;j++) b[j]=read(); for(int j=1;j<=x;j++) for(int k=1;k<=x;k++) if((b[j]^b[k])&&!Vis[b[j]][b[k]]) addedge(b[j],b[k]),Vis[b[j]][b[k]]=1; } MCS();bool fl=0; for(int i=n;i;i--){ if(vis[st[i]]){ ans++; continue; } Max=0,id=-1; for(int j=head[st[i]];j;j=e[j].to) if(loc[e[j].v]<i&&loc[e[j].v]>Max) Max=loc[e[j].v],id=e[j].v; if(~id) vis[id]=1; } printf("%d\n",ans); return 0; }