#include<bits/stdc++.h>
using namespace std;
int n1,n2,n3,m,st,ed;
struct edge{
int v,w,nx;
}e[1000005];
int cnt=1,hd[510005],cur[510005];
void add(int u,int v,int w){
e[++cnt]=edge{v,w,hd[u]};
hd[u]=cnt;
}
int dis[510005];
bool bfs(){
queue<int> q;q.push(st);
memset(dis,0x3f,sizeof(dis));dis[st]=0;
while(!q.empty()){
int u=q.front();q.pop();
// printf("%d\n",u);
for(int i=hd[u];i;i=e[i].nx){
int v=e[i].v;
// printf(" %d %d %d %d\n",v,e[i].w,dis[u]+1,dis[v]);
if(e[i].w<=0 || dis[v]<=dis[u]+1)continue;
dis[v]=dis[u]+1;q.push(v);
}
}
return dis[ed]!=0x3f3f3f3f;
}
int calc(int u,int La){
if(u==ed)return La;
int res=0;
for(int i=cur[u];i;i=e[i].nx){
cur[u]=i;
int v=e[i].v;if(e[i].w<=0 || dis[v]!=dis[u]+1)continue;
int p=calc(v,min(La,e[i].w));
if(p==0)dis[v]=0x3f3f3f3f;
e[i].w-=p;e[i^1].w+=p;
res+=p;La-=p;
}
return res;
}
int dinic(){
int res=0;
while(bfs()){
for(int i=1;i<=ed;i++)cur[i]=hd[i];
res+=calc(st,1e9);
}
// for(int i=1;i<=ed;i++)printf("%d ",dis[i]);puts("");
return res;
}
int main(){
scanf("%d%d%d",&n1,&n2,&n3);
st=n1+n1+n2+n3+1;ed=st+1;
scanf("%d",&m);
for(int i=1;i<=m;i++){
int u,v;scanf("%d%d",&u,&v);
add(u,v+n1+n1,0);add(v+n1+n1,u,1);
}
scanf("%d",&m);
for(int i=1;i<=m;i++){
int u,v;scanf("%d%d",&u,&v);
add(u+n1,v+n1+n1+n2,1);add(v+n1+n1+n2,u+n1,0);
}
for(int i=1;i<=n2;i++)add(st,n1+n1+i,1),add(n1+n1+i,st,0);
for(int i=1;i<=n3;i++)add(n1+n1+n2+i,ed,1),add(ed,n1+n1+n2+i,0);
for(int i=1;i<=n1;i++)add(i,i+n1,1),add(i+n1,i,0);
printf("%d\n",dinic());
return 0;
}
加边思路和第一篇题解一样
但是dinic莫名TLE了,对比了一下好像没啥问题