Description
有n头奶牛,每头奶牛都有自己喜欢的几个谷仓,每个谷仓只能供应一头奶牛进食,问最多能有多少头奶牛可以去自己喜欢的谷仓吃食物
Input
第一行为两个整数n和m分别表示奶牛数和谷仓数,之后n行每行首先输入一个整数num表示该头奶牛喜欢的谷仓数,之后num个整数表示这个奶牛的喜欢的谷仓编号
Output
输出最多能有多少头奶牛可以吃到食物
Sample Input
5 5
2 2 5
3 2 3 4
2 1 5
3 1 2 5
1 2
Sample Output
4
Solution
二分匹配裸题,直接套模版
Code
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
#define maxn 222
int uN,vN;
int g[maxn][maxn];
int linker[maxn];
bool used[maxn];
bool dfs(int u)
{
int v;
for(v=0;v<vN;v++)
if(g[u][v]&&!used[v])
{
used[v]=true;
if(linker[v]==-1||dfs(linker[v]))
{
linker[v]=u;
return true;
}
}
return false;
}
int hungary()
{
int res=0;
int u;
memset(linker,-1,sizeof(linker));
for(u=0;u<uN;u++)
{
memset(used,0,sizeof(used));
if(dfs(u)) res++;
}
return res;
}
int main()
{
while(~scanf("%d%d",&uN,&vN))
{
memset(g,0,sizeof(g));
for(int i=0;i<uN;i++)
{
int num,j;
scanf("%d",&num);
while(num--)
{
scanf("%d",&j);
g[i][j-1]=1;
}
}
int ans=hungary();
printf("%d\n",ans);
}
return 0;
}