题目链接:点击打开链接
题目分析:二分图最大匹配
资料链接:陈队长的推荐下看了大牛的博客,终于明白了,经典的模板题
include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 510
int k,m,w;
int match[maxn][maxn];
int left[maxn],visit[maxn];
bool find_path(int x)
{
for(int i=1;i<=m;i++)
{
if(!visit[i]&&match[x][i])//注意,一定是题目要求的匹配
{
visit[i]=1;
if(!left[i]||find_path(left[i]))//次点要么是未盖点,那么就形成了一条增广路,或者他所链接的有增广路
{
left[i]=x; return true;
}
}
}
return false;
}
int hungary()
{
int sum=0;
for(int i=1;i<=w;i++)
{
memset(visit,0,sizeof(visit));
if(find_path(i)) sum++;//枚举未盖点,从空匹配开始
} return sum;
}
int main()
{
int i,a,b,sum;
while(scanf("%d",&k)!=EOF&&k)
{
scanf("%d %d",&w,&m);
memset(match,0,sizeof(match));
memset(left,0,sizeof(left));
for(i=0;i<k;i++)
{
scanf("%d %d",&a,&b);
match[a][b]=1;
}
printf("%d\n",hungary());
}
return 0;
}