有超时也有WA 0pts
#include<bits/stdc++.h>
#define N 5000010
#define INF 1000010
#define int long long
using namespace std;
int n1, n2, n3;
int m1, m2;
int ans=0;
int tmp=0, head[N<<1];
int d[N], now[N], s, t;
struct edge{
int to, next, w;
}e[N<<2];
void add(int u, int v, int w){
e[tmp] = (edge){v, head[u], w};
head[u] = tmp++;
}
bool bfs(){
for(int i=1; i<=(n1+n2+n3)*4; i++) d[i]=INF;
queue<int> q;
q.push(s);
d[s] = 1; now[s] = head[s];
while(!q.empty()){
int u = q.front();
q.pop();
for(int i=head[u]; ~i; i=e[i].next){
int v = e[i].to;
if(e[i].w>0 && d[v]==INF){
q.push(v);
d[v] = d[u]+1;
now[v] = head[v];
if(v == t) return true;
}
}
}
return false;
}
int dfs(int x, int flow){
int flo=0;
//cout<< x<< " ---> ";
if(x==t) return flow;
for(int i=now[x]; ~i; i=e[i].next){
now[x] = i;
int y = e[i].to;
if(d[y]==d[x]+1 && e[i].w>0){
int k=dfs(y, min(flow, e[i].w));
if(k==0) d[y]=INF;
e[i].w -= k; e[i^1].w += k;
flo+=k;
flow-=k;
}
}
return flo;
}
signed main()
{
//freopen("P1110.in","r",stdin);
//freopen("manager.out","w",stdout);
scanf("%lld%lld%lld", &n1, &n2, &n3);
s=0, t=n1+n1+n2+n3+2;
memset(head, -1, sizeof(head));
for(int i=1; i<=n1; i++)
add(i, i+n1+n2+n3, 1), add(i+n1+n2+n3, i, 0);
scanf("%lld", &m1);
for(int i=1; i<=m1; i++){
int u, v;
scanf("%lld%lld", &u, &v);
add(s, v+n1, 1); add(v+n1, s, 0);
add(v+n1, u, 1); add(u, v+n1, 0);
}
scanf("%lld", &m2);
for(int i=1; i<=m2; i++){
int u, v;
scanf("%lld%lld", &u, &v);
add(v+n1+n2, t, 1); add(t, v+n1+n2, 0);
add(u+n1+n2+n3, v+n1+n2, 1); add(v+n1+n2, u+n1+n2+n3, 0);
}
while(bfs()){
ans += dfs(s, INF);
}
printf("%lld", ans);
return 0;
}