bool bfs()
{
queue <int> q;
memset(lev, -1, sizeof(lev));
q.push(S);
lev[S] = 0;
while(!q.empty()) {
int u = q.front(); q.pop();
for(int i = head[u]; ~i; i = e[i].next) {
int v = e[i].v;
if(e[i].w && lev[v] == -1) {
lev[v] = lev[u] + 1;
q.push(v);
if(v == T) return true;
}
}
}
return false;
}
int Dinic()
{
int ret = 0;
while(bfs()) {
memcpy(cur, head, sizeof(head));
int u = S, top = 0;
while(1) {
if(u == T) {
int mini = INF, loc;
for(int i = 0; i < top; i++) {
if(mini > e[s[i]].w) {
mini = e[s[i]].w;
loc = i;
}
}
for(int i = 0; i < top; i++) {
e[s[i]].w -= mini;
e[s[i]^1].w += mini;
}
ret += mini;
top = loc;
u = e[s[top]].u;
}
int &i = cur[u];
for(; ~i; i = e[i].next) {
int v = e[i].v;
if(e[i].w && lev[v] == lev[u] + 1) break;
}
if(~i) {
s[top++] = i;
u = e[i].v;
}
else {
if(!top) break;
lev[u] = -1;
u = e[s[--top]].u;
}
}
}
return ret;
}