题目:
https://www.luogu.org/problem/show?pid=1894
裸的二分图最大匹配;
直接跑匈牙利;
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=2001;
int n,m,tot,cnt;
int fst[MAXN],nxt[MAXN],sc[MAXN];
bool vis[MAXN];
struct hh
{
int from,to;
}ma[MAXN<<1];
void build(int f,int t)
{
tot++;
ma[tot]=(hh){f,t};
nxt[tot]=fst[f];
fst[f]=tot;
return;
}
bool dfs(int x)
{
for(int i=fst[x];i;i=nxt[i])
{
int v=ma[i].to;
if(!vis[v])
{
vis[v]=1;
if(!sc[v] || dfs(sc[v]))
{
sc[v]=x;
return true;
}
}
}
return false;
}
void solve()
{
int num,x;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&num);
while(num--)
{
scanf("%d",&x);
build(i,x);
}
}
for(int i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
if(dfs(i)) cnt++;
}
cout<<cnt;
return;
}
int main()
{
solve();
return 0;
}