匈牙利算法
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,ans=0;
int visit[10100],cow[10100],link[1009][1009];
bool judge(int x)
{
for (int i=1;i<=m;i++)
{
if (link[x][i]&&!visit[i])
{
visit[i]=1;
if (!cow[i]||judge(cow[i])) {cow[i]=x;return true;}
}
}
return false;
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
{
int num,x;scanf("%d",&num);
for (int j=1;j<=num;j++) scanf("%d",&x),link[i][x]=1;
}
for (int i=1;i<=n;i++)
{if (judge(i)) ans++;memset(visit,0,sizeof(visit));}
printf("%d\n",ans);
return 0;
}