就是感觉没问题
#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9+7;
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
void write(int x){
if(x<0){putchar('-');x=-x;}
if(x>9) write(x/10);
putchar(x%10+'0');
}
int n,m,e,s,t,ans;
int head[5114],tot = 1;
int dis[5114],now[5114];
struct node{
int nex,to,w;
}edge[5000005];
void add(int x,int y,int w)
{
edge[++tot].nex = head[x];
edge[tot].to = y; edge[tot].w = w;
head[x] = tot;
}
bool bfs()
{
for (int i = 0; i <= n+m+1; i++) dis[i] = INF;
queue<int> q;
q.push(s);
now[s] = head[s]; dis[s] = 0;
while (!q.empty())
{
int u = q.front(); q.pop();
for (int i = head[u]; i; i = edge[i].nex)
{
int v = edge[i].to,w = edge[i].w;
if (w > 0 && dis[v] == INF)
{
now[v] = head[v];
dis[v] = dis[u]+1;
q.push(v);
if (v == t) return 1;
}
}
}
return 0;
}
int dfs(int x,int inflow)
{
if (x == t) return inflow;
int k = 0,outflow = 0;
for (int i = now[x]; i && inflow; i = edge[i].nex)
{
int v = edge[i].to,w = edge[i].w;
now[x] = i;
if (w > 0 || dis[v]==dis[x]+1)
{
k = dfs(v,min(w,inflow));
if (!k) dis[v] = INF;
edge[i].w -= k; edge[i^1].w += k;
inflow -= k; outflow += k;
}
}
return outflow;
}
signed main()
{
// freopen("P3386_5.in","r",stdin);
// freopen("1.out","w",stdout);
n = read(); m = read(); e = read();
s = 0; t = n+m+1;
for (int i = 1; i <= n; i++)
add(s,i,1),add(i,s,0);
for (int i = n+1; i <= n+m; i++)
add(i,t,1),add(t,i,0);
for (int i = 1,u,v; i <= e; i++)
{
u = read(),v = read();
if(u>n||v>m) continue;
add(u+1,v+n+1,1); add(v+n+1,u+1,0);
}
while (bfs()) ans += dfs(s,INF);
write(ans);
return 0;
}