struct dinic{
struct ppo{
int v,c,next;
}e[N<<2];
int S,T,tot,h[N],d[N];
void init(){
S=0,T=1,tot=0;
memset(h,-1,sizeof(h));
}
void ae(int u,int v,int c){
e[tot]=ppo{v,c,h[u]};
h[u]=tot++;
}
void add(int u,int v,int c){
ae(u,v,c);
ae(v,u,0);
}
bool bfs(){
memset(d,-1,sizeof(d));
queue<int>q;
q.push(S);
d[S]=0;
while(!q.empty()){
int u=q.front();q.pop();
for(int i=h[u];~i;i=e[i].next){
int x=e[i].v,w=e[i].c;
if(d[x]==-1&&w){
d[x]=d[u]+1;
q.push(x);
}
}
}
return (d[T]!=-1);
}
int dfs(int u,int flow){
if(u==T) return flow;
int res=0;
for(int i=h[u];~i;i=e[i].next){
int x=e[i].v;
if(e[i].c&&d[u]+1==d[x]){
int tmp=dfs(x,min(flow,e[i].c));
flow-=tmp;
e[i].c-=tmp;
e[i^1].c+=tmp;
res+=tmp;
if(flow==0) break;
}
}
if(res==0) d[u]=-1;
return res;
}
int solve(){
int res=0;
while(bfs()){
res+=dfs(S,inf);
}
return res;
}
}dick;