我对二分图匹配有了新理解,二分图的精华在于“二分”这两个字——整个图可以被分成两部分,我们在进行匹配的时候是在分清了二分图的两部分后才进行的,就是说:对于一个结点,我们在二分图匹配的时候已经知道了它的位置,即左边的半个图或者右边的半个图。
此题应是模板题。
/*
ID: creativ3
TASK: stall4
LANG: C
*/
/*
* USACO: the perfect stall
* mike-w
* 2011-10-21
* 二分图匹配
* ps: 刚才我犯了一个愚蠢的错误!
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#define SIZE 222
int f[SIZE][SIZE];
int match[SIZE];
int tag[SIZE];
int N,M;
int search(int node)
{
int i;
for(i=1;i<=N;i++)
if(f[node][i] && !tag[i])
{
tag[i]=1;
if(!match[i] || search(match[i]))
{
match[i]=node;
return 1;
}
}
return 0;
}
int main(void)
{
int i,j,k,count;
assert(freopen("stall4.in","r",stdin));
assert(freopen("stall4.out","w",stdout));
/* read in data */
scanf("%d%d",&N,&M);
for(i=1;i<=N;i++)
{
scanf("%d",&j);
while(j-->0)
{
scanf("%d",&k);
f[i][k]=1;
}
}
/* core part */
for(count=0,i=1;i<=N;i++)
{
memset(tag,0,sizeof(tag));
if(search(i))
count++;
}
printf("%d\n",count);
return 0;
}