广州二中苏元实验学校一共有n个社团,分别用1到n编号。
广州二中苏元实验学校一共有m个人,分别用1到m编号。每个人可以参加一个或多个社团,也可以不参加任何社团。
广州二中苏元实验学校一共有m个人,分别用1到m编号。每个人可以参加一个或多个社团,也可以不参加任何社团。
每个社团都需要选一个代表。谦哥希望更多的人能够成为代表。
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int maxn=410;
const int maxm=40010;
int n,m,size=0;
int u[maxm],v[maxm],first[maxn],next[maxm],link1[maxn],vis[410];
void init()
{
freopen("wiki.in","r",stdin);
freopen("wiki.out","w",stdout);
}
void insert(int x,int y)
{
size++;
int z=size;
u[z]=x;
v[z]=y;
next[z]=first[x];
first[x]=z;
}
void readdata()
{
memset(first,-1,sizeof(first));
memset(next,-1,sizeof(next));
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
while(x!=0)
{
insert(i,x);
scanf("%d",&x);
}
}
}
int clock_vis;
bool find(int k)
{
for(int e=first[k];e!=-1;e=next[e])
{
int vv=v[e];
if(vis[vv]==clock_vis) continue;
vis[vv]=clock_vis;
if(link1[vv]==-1 || find(link1[vv]))
{
link1[vv]=k;
return true;
}
}
return false;
}
void work()
{
int ans=0;
memset(link1,-1,sizeof(link1));
for(int i=1;i<=n;i++)
{
clock_vis=i;
if(find(i)) ans++;
}
printf("%d\n",ans);
}
int main()
{
init();
readdata();
work();
return 0;
}