http://acm.hdu.edu.cn/showproblem.php?pid=2063
#include <iostream>
#include <cstring>
using namespace std;
const int maxx=502;
int gra[maxx][maxx];
int sy[maxx]; //记录是否被访问过
int cy[maxx]; //求匹配状态
int ans,m,n; //ans是最大匹配数
int path(int u)
{
int v;
for(v=1; v<=n; v++)
if(gra[u][v]>0&&!sy[v]) //和v相邻的节点
{
sy[v]=1;
if(!cy[v]||path(cy[v])) //v没有匹配或者从cy[v]出发可以找到一条增广路
{
cy[v]=u; //修改匹配
return 1;
}
}
return 0;
}
void MaxMatch()
{
ans=0;
int i;
memset(cy,0,sizeof(cy));
for(i=1; i<=m; i++)
{
memset(sy,0,sizeof(sy));
ans+=path(i);
}
return ;
}
int main()
{
int k,a,b;
while(cin>>k&&k)
{
memset(gra,0,sizeof(gra));
cin>>m>>n;
while(k--)
{
cin>>a>>b;
gra[a][b]=1;
}
MaxMatch();
cout<<ans<<endl;
}
}