#include<bits/stdc++.h>
using namespace std;
//defines
const int N=505,M=2005;
//data
int n1,n2,m;
//edge
int ecnt=1,hd[N];
struct edge{
int nxt,v,w;
}e[M*2];
void addEdge(int u,int v,int w){
e[++ecnt].v=v; e[ecnt].w=w; e[ecnt].nxt=hd[u]; hd[u]=ecnt;
}
void addedge(int u,int v,int w){
addEdge(u,v,w); addEdge(v,u,0);
}
//maxf
int s,t,maxf,dis[N],now[N];
bool spfa(){
queue<int>q;
memset(dis,0,sizeof(dis)); dis[s]=1; q.push(s);
while(!q.empty()){
int u=q.front(); q.pop();
for(int i=hd[u];i;i=e[i].nxt){
int v=e[i].v;
if(!dis[v]&&e[i].w>0){
dis[v]=dis[u]+1; q.push(v);
}
}
}
return dis[t];
}
int dinic(int u,int gx){
if(u==t) return gx;
int res=0;
for(int &i=now[u];i&&gx;i=e[i].nxt){
int k,v=e[i].v;
if(dis[v]==dis[u]+1&&(k=dinic(v,min(e[i].w,gx)))){
e[i].w-=k; e[i^1].w+=k; res+=k; gx-=k;
}
}
return res;
}
void maxflow(){
while(spfa()){
memcpy(now,hd,sizeof(hd));
maxf+=dinic(s,0x7ffffff);
}
}
//main
signed main(){
cin>>n1>>n2>>m;
for(int i=0;i<m;i++){
int l,r; cin>>l>>r;
addedge(l,r+n1,1);
}
for(int i=1;i<=n1;i++) addedge(0,i,1);
for(int i=1;i<=n2;i++) addedge(n1+i,n1+n2+1,1);
s=0,t=n1+n2+1; maxflow();
cout<<maxf<<endl;
}
网络流写法