bool bfs()
{
memset(dis,-1,sizeof(dis));
dis[1]=0;
queue<int>q;
q.push(1);
while (!q.empty()){
int r=q.front();q.pop();
for (int i=head[r];i!=-1;i=edge[i].nxt){
int j=edge[i].e;
if (dis[j]==-1&&edge[i].v){
dis[j]=dis[r]+1;
q.push(j);
}
}
}
return dis[n]!=-1;
}
int dfs(int u,int flow)
{
if (u==n)return flow;
int delta=flow;
for (int i=head[i];i!=-1;i=edge[i].nxt){
int v=edge[i].e;
if (dis[v]==dis[u]+1&&edge[i].v>0){
int d=dfs(v,min(delta,edge[i].v));
edge[i].v-=d;edge[i^1].v+=d;
delta-=d;
if (delta==0)break;
}
}
return flow-delta;
}
int dini()
{
int ans=0;
while (bfs()){
ans+=dfs(1,INF);
}
return ans;
}