代码最后有测试数据
#include<iostream>
#include<cstring>
#include<queue>
#define S (n+m+1)
#define T (n+m+2)
using namespace std;
const int N=10005,inf=0x7fffffff;
int n,m,cnt;
struct edge
{
int to,nxt,v;
}e[N*15];
int head[N],dep[N],cur[N];
void add(int u,int v,int w)
{
e[++cnt].to=v;
e[cnt].nxt=head[u];
head[u]=cnt;
e[cnt].v=w;
}
bool bfs()
{
queue<int> q;
memset(dep,0,sizeof dep);
dep[S]=1;
q.push(S);
while(!q.empty())
{
int now=q.front();q.pop();
for(int i=head[now];i;i=e[i].nxt)
{
if(dep[e[i].to]==0&&e[i].v>0)
{
dep[e[i].to]=dep[now]+1;
q.push(e[i].to);
}
}
}
return dep[T]>0;
}
int dfs(int now,int flow)
{
if(now==T) return flow;
for(int& i=cur[now];i;i=e[i].nxt)
{
if(dep[e[i].to]!=dep[now]+1||e[i].v==0) continue;
int d=dfs(e[i].to,min(flow,e[i].v));
if(d>0)
{
e[i].v-=d;
if(i%2) e[i+1].v-=d;
else e[i-1].v-=d;
return d;
}
}
return 0;
}
int dinic()
{
int ans=0;
while(bfs())
{
for(int i=1;i<=n+m+2;i++)
cur[i]=head[i];
int d;
while(d=dfs(S,inf))
ans+=d;
}
return ans;
}
int main()
{
cin>>n>>m;
int M;
cin>>M;
for(int i=1;i<=n;i++)
add(S,i,inf),add(i,S,0);
for(int i=1;i<=m;i++)
add(i+n,T,inf),add(T,i+n,0);
for(int i=1;i<=M;i++)
{
int u,v;
cin>>u>>v;
add(u,v+n,1);
add(v+n,u,0);
}
cout<<dinic();
return 0;
}
/*in:4 2 12
3 1
1 2
3 2
3 1
1 1
3 2
4 2
4 1
1 1
1 2
3 2
3 1
out:2
myout:12
*/