#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
const int inf=1e9+7;
struct edge{
int c,to,next;
}e[2000000];
int head[5000],level[5000],cnt;
void add(int u,int v,int w){
e[cnt].c=w;
e[cnt].to=v;
e[cnt].next=head[u];
head[u]=cnt++;
}
int bfs(int s,int t){
queue<int>q;
memset(level,-1,sizeof(level));
q.push(s);
level[s]=0;
while(!q.empty()){
int u,v;
u=q.front();
q.pop();
for(int i=head[u];~i;i=e[i].next){
v=e[i].to;
if(level[v]==-1&&e[i].c){
level[v]=level[u]+1;
q.push(v);
}
}
}
if(level[t]==-1)return 0;
return 1;
}
int dfs(int u,int v,int flow){
if(u==v)return flow;
int res=0;
for(int i=head[u];~i;i=e[i].next){
int j=e[i].to;
if(level[j]==level[u]+1&&e[i].c){
int f=dfs(j,v,min(e[i].c,flow-res));
res+=f;
e[i].c-=f;
e[i^1].c+=f;
}
}
if(!res)level[u]=-1;
return res;
}
int main()
{
int n,m,E,i,j,k,u,v,ans=0;
scanf("%d%d%d",&n,&m,&E);
memset(head,-1,sizeof(head));
for(i=1;i<=E;i++){
scanf("%d%d",&u,&v);
if(v>m)continue;
add(u,v+n,1);
add(v+n,u,0);
}
for(i=1;i<=n;i++){
add(n+m+1,i,1);
add(i,n+m+1,0);
}
for(i=1;i<=m;i++){
add(n+i,n+m+2,1);
add(n+m+2,n+i,0);
}
int s=n+m+1,t=n+m+2;
while(bfs(s,t))
while(int a=dfs(s,t,inf))
ans+=a;
printf("%d\n",ans);
return 0;
}
by SKY_magician @ 2018-02-06 14:22:18
这头像很6(逃)
by Edgration @ 2018-02-06 14:26:13
@[Edgration](/space/show?uid=42857) 呵呵
by SKY_magician @ 2018-02-06 14:32:38
数组再开大一点点试试?
by 142857cs @ 2018-02-27 09:43:40