rt,样例无输出。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int M=5e4+10,N=1005;
const int inf=1e9;
int s,t,n,m,T;
struct edge{
int nxt,to,dis;
}e[M<<1];
int head[N<<1],cnt=1;
int dep[N],cur[N];
inline void add(int u,int v,int d){
e[++cnt]=(edge){head[u],v,d};
head[u]=cnt;
}
namespace Net{
bool bfs(){
queue<int>q;
while(!q.empty()) q.pop();
for(int i=1;i<=n;i++)
dep[i]=0;
dep[s]=1;
q.push(s);
while(!q.empty()){
int u=q.front();q.pop();
for(int i=head[u];i;i=e[i].nxt){
if(e[i].dis>0&&dep[e[i].to]==0){
dep[e[i].to]=dep[u]+1;
q.push(e[i].to);
}
}
}
if(dep[t]) return 1;
else return 0;
}
int dfs(int u,int dist){
if(u==t) return dist;
for(int& i=cur[u];i;i=e[i].nxt){
int v=e[i].to;
if(dep[v]==dep[u]+1&&e[i].dis!=0){
int d=dfs(v,min(dist,e[i].dis));
if(d>0){
e[i+1].dis-=d;
e[i^1].dis+=d;
return d;
}
}
}
return 0;
}
inline int Dinic(){
int ans=0;
while(bfs()){
for(int i=1;i<=n;i++)
cur[i]=head[i];
while(int di=dfs(s,inf))
ans+=di;
}
return ans;
}
}
signed main(){
cin.tie(nullptr)->sync_with_stdio(false);
cout.tie(nullptr);
cin>>n>>m>>T;
s=0,t=n+m+1;
for(int i=1;i<=n;i++){
add(0,i,1);
add(i,0,0);
}
for(int i=n+1;i<=n+m;i++){
add(i,t,1);
add(t,i,0);
}
for(int i=1;i<=T;i++){
int u,v;
cin>>u>>v;
add(u,v+n,1);
add(v+n,u,0);
}
cout<<Net::Dinic();
return 0;
}