/*
匈牙利算法--求二分图的最大匹配 O(mn)
实际运行时间远小于Onm
1.二分图的匹配:给定一个二分图G,在G的一个子图M中,M的边集{E}中的任意两条边都不依附于同一个顶点,则称M是一个匹配
2.二分图的最大匹配:所有匹配中包含边数最多的一组匹配被称为二分图的最大匹配,其边数即为最大匹配数。
*/
#include<bits/stdc++.h>
using namespace std;
const int N = 510;
const int M = 1e5 + 10;
int h[N], e[M], ne[M], idx;
int match[N];
bool st[N];
int n1, n2, m;
void add(int a, int b) {
e[idx] = b;
ne[idx] = h[a];
h[a] = idx++;
}
bool find(int a) {
for (int i = h[a]; i != -1; i = ne[i]) {
int j = e[i];
if (!st[j]) {//如果这个女生没考虑过
st[j] = true;//考虑过了
if (match[j] == 0 || find(match[j])) { //match[j]记录了女神的男朋友
match[j] = a; //匹配成功标记女神的男朋友是啊 //match[j]=0,女神没对象
return true; //|| 能给女神的对象找到新的
}
}
}
return false;
}
int main()
{
memset(h, -1, sizeof(h));
cin >> n1 >> n2 >> m;
for (int i = 1; i <= m; i++) {
int a, b;
cin >> a >> b;
add(a, b);
}
int res = 0; //res 记录匹配成功的总数
for (int i = 1; i <= n1; i++) {
memset(st, false, sizeof(st));//st是为了防止在匹配过程中,总是考虑一个女生,所以每次匹配前初始化为都没考虑过
if (find(i)) {//如果匹配成功则res++
res++;
}
}
cout << res << endl;
return 0;
}