思路
本题可以用最大流写也可以用二分图,网络流部分题目我讲究的是做出来即可。因为比赛未必会看的出来是网络流的图。先基础全过一遍再说变形题。
AC代码
#include<stdio.h>
#include<string.h>
const int N=220;
//5 5 //ncows
//2 2 5
//3 2 3 4
//2 1 5
//3 1 2 5
//1 2
int n,m;
int e[N][N],match[N];
bool book[N];
int dfs(int i)
{
for(int j=1; j<=n; j++)
{
if(book[j]==false&&e[i][j]==1)
{
book[j]=true;
if(match[j]==0||dfs(match[j])==1)
{
match[j]=i;
return 1;
}
}
}
return 0;
}
int main()
{
int k,kk;
while(~scanf("%d %d",&n,&m))
{
memset(e,0,sizeof(e));
memset(match,0,sizeof(match));
// memset(book,0,sizeof(book));
for(int i=1; i<=n; i++)
{
scanf("%d",&k);
for(int j=1; j<=k; j++)
{
scanf("%d",&kk);
e[i][kk]=1;
}
}
int sum=0;
for(int i=1; i<=n; i++)
{
// for(int j=1;j<=n;j++)
// book[j]=0;
memset(book,0,sizeof(book));
if(dfs(i))
sum++;
}
printf("%d
",sum);
}
return 0;
}