二分图匹配
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int head[1010],to[100010],nxt[100010],link[100010],tot=0;
bool vis[1010];
void add(int u,int v)
{
to[++tot]=v,nxt[tot]=head[u],head[u]=tot;
return;
}
bool find(int x)
{
int v;
for(int i=head[x];i;i=nxt[i])
if(!vis[v=to[i]])
{
vis[v]=1;
if(!link[v]||find(link[v])){link[v]=x,link[x]=v;return 1;}
}
return 0;
}
int main()
{
int n,m,e,u,v,i,ans;
memset(head,0,sizeof(head));
memset(vis,0,sizeof(vis));
memset(link,0,sizeof(link));
scanf("%d%d%d",&n,&m,&e);
for(int i=0;i<e;++i)
scanf("%d%d",&u,&v),v+=n,add(u,v),add(v,u);
for(ans=0,i=1;i<=n;i++)
memset(vis,0,sizeof(vis)),ans+=find(i);
printf("%d",ans);
return 0;
}