很裸的二分匹配。。。
#include<iostream>
#include<cstring>
#include<cstdlib>
using namespace std;
int g[505][505];
int vis[505];
int link[505];
int n,m,k;
bool dfs(int u)
{
for(int i=1;i<=n;i++)
if(g[u][i] && !vis[i])
{
vis[i]=1;
if( link[i]==-1 || dfs(link[i]) )
{
link[i]=u;
return true;
}
}
return false;
}
int main()
{
while(scanf("%d",&k)==1&&k)
{
scanf("%d %d",&m,&n);
memset(g,0,sizeof(g));
for(int i=0;i<k;i++)
{
int a,b;
scanf("%d %d",&a,&b);
g[a][b]=1;
}
int ans=0;
memset(link,-1,sizeof(link));
for(int i=1;i<=m;i++)
{
memset(vis,0,sizeof(vis));
if(dfs(i))
ans++;
}
printf("%d\n",ans);
}
return 0;
}