推荐一篇Blog
//Hungarian Algorithm
#include<cstdio>
#include<cstring>
#define MAXN 1005
using namespace std;
int link[MAXN],head[MAXN];
bool vis[MAXN];
int N,M,E,tot=0;
struct size{
int v,next;
}G[MAXN*MAXN];
inline void add(int u,int v){
G[++tot].v=v;G[tot].next=head[u];head[u]=tot;
}
inline bool dfs(int u){
for(register int i=head[u];i;i=G[i].next){
int v = G[i].v;
if(vis[v]==0){
vis[v]=1;
if(link[v]==0||dfs(link[v])){
link[v]=u;vis[u]=1;return 1;
}
}
}
return 0;
}
int main(){
scanf("%d%d%d",&N,&M,&E);
int u,v;
for(register int i=1;i<=E;++i){
scanf("%d%d",&u,&v);
if(v>M)continue;
add(u,v);
}
int ans = 0;
for(register int i=1;i<=N;++i){
memset(vis,0,sizeof(vis));
if(dfs(i))ans++;
}
printf("%d",ans);
return 0;
}