ACcode:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=5e2+10, M=1e5+10;
int n,m,k,ans;
struct E{//链式向前星存储图
int v,next;
}e[M];
int head[N],cnt;
int match[N];//村女生i的男朋友
bool vis[N];//存女生i是否被访问过
void add(int u,int v){
e[++cnt]={v,head[u]};
head[u]=cnt;
}
bool dfs(int u){//匈牙利算法(二分图最大匹配)
for(int i=head[u];i;i=e[i].next){
int v=e[i].v;//妹子
if(vis[v]) continue;
vis[v]=true;
if(!match[v]||dfs(match[v])){//这个女生没男朋友或者她的男朋友可以把这个女生让出来
//,他自己再找一个他心意女生。
match[v]=u;//配成对
return true;
}
}
return false;
}
void solve() {
cin>>n>>m>>k;
while(k--){//建图
int u,v;
cin>>u>>v;
add(u,v);
}
for(int i=1;i<=n;i++){//枚举每个男生
memset(vis,false,sizeof vis);//即女生都可以选择
//但是该男生只会在自己心意的女生中选择,之所以将所用vis初始化为0,是因为一个女生可能被很多
//男生所心意,当前男生心意的女生可能被之前的男生所标记访问过了,为了当前男生还可以再访问该女生
//那就得把该女生初始化为未访问,因为这样女生不只是一个,所用就memset初始化了。
if(dfs(i)) ans++;//return true,即配对数+1
}
cout<<ans;
}
signed main() {
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int tt=1;
//cin>>tt;
while(tt--) {
solve();
}
return 0;
}