选择边数最大的子图称为最大匹配问题
#include<bits/stdc++.h>
using namespace std;
const int N = 510,M = 100010;
int n1,n2,m;
int now[M],nex[M],to[M],idx;
int vis[N];
int match[N];
void add(int x,int y){
to[idx] = y;
nex[idx] = now[x];
now[x] = idx++;
}
int find(int x){
for(int i = now[x] ; i != -1; i = nex[i]){
int j = to[i];
if(!vis[j]){
vis[j] = 1;
if(!match[j]||find(match[j])){
match[j] = x;
return 1;
}
}
}
return 0;
}
int main(){
fill(now,now+N,-1);
cin>>n1>>n2>>m;
for(int i = 0; i < m;i++){
int a,b;
cin>>a>>b;
add(a,b);
}
int ans=0;
for(int i = 1;i <= n1;i++){
fill(vis,vis+N,0);
if(find(i)) ans++;
}
cout<<ans;
}