## TQL
by MorsLin @ 2018-05-23 20:22:24
```cpp
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<cmath>
#include<queue>
#define MAXN 100010
using namespace std;
int n1,n2,n3,s,t;
struct edge
{
int v;
int next;
int cap;
}edge[MAXN];
int dist[MAXN],head[MAXN],cur[MAXN];
int total=0;
void add(int f,int t,int l)
{
edge[total].v=t;
edge[total].cap=l;
edge[total].next=head[f];
head[f]=total++;
edge[total].v=f;
edge[total].cap=0;
edge[total].next=head[t];
head[t]=total++;
}
bool BFS()
{
memset(dist,-1,sizeof(dist));
queue<int> q;
while(!q.empty()) q.pop();
q.push(s); dist[s]=0;
while(!q.empty())
{
int cnt=q.front();
q.pop();
for(int i=head[cnt];i!=-1;i=edge[i].next)
{
if(dist[edge[i].v]==-1)
if(edge[i].cap>0)
{
dist[edge[i].v]=dist[cnt]+1;
q.push(edge[i].v);
if(edge[i].v==t) break;
}
}
}
return dist[t]!=-1;
}
int DFS(int cnt,int cap)
{
if(cnt==t||cap==0) return cap;
int res=0,f;
for(int i=head[cnt];i!=-1;i=edge[i].next)
{
if(dist[edge[i].v]==dist[cnt]+1)
if(edge[i].cap>0)
if((f=DFS(edge[i].v,min(cap-res,edge[i].cap)))>0)
{
edge[i].cap-=f;
edge[i^1].cap+=f;
res+=f;
if(cap==res) return cap;
}
}
if(res<cap) dist[cnt]=-1;
return res;
}
int dinic()
{
int ans=0;
while(BFS())
{
//for(int i=0;i<=n1*2+n2+n3+1;i++)
// cur[i]=head[i];
ans+=DFS(s,MAXN);
}
return ans;
}
int main()
{
memset(head,-1,sizeof(head));
scanf("%d%d%d",&n1,&n2,&n3);
s=0;t=n2+n1*2+n3+1;
int m1,m2,x,y;
for(int i=1;i<=n2;i++)
add(s,i,1);
scanf("%d",&m1);
for(int i=1;i<=m1;i++)
{
scanf("%d%d",&x,&y);
add(y,x+n2,1);
}
for(int i=1;i<=n1;i++)
add(i+n2,i+n1+n2,1);
scanf("%d",&m2);
for(int i=1;i<=m2;i++)
{
scanf("%d%d",&x,&y);
add(x+n2+n1,y+n2+n1*2,1);
}
for(int i=1;i<=n3;i++)
add(i+n1*2+n2,t,1);
int anss=dinic();
printf("%d",anss);
return 0;
}
```
by MorsLin @ 2018-05-23 21:35:36