int main(int argc, char* argv[]) { int total; scanf("%d", &total); while(total--) { init(); push_flow(); } return 0; }
int max_flow(){ bfs(); //memset(d,0,sizeof(d)); memset(cnt,0,sizeof(cnt)); for (int i = 0; i < n; ++ i){ if (d[i] != inf) cnt[d[i]]++; } int x = st, ans = 0; memset(cur, 0, sizeof(cur)); for (int i = 0; i < n; ++ i){ cur[i] = h[i]; } while (d[st] < n){ if (x == en){ ans += push_flow(); x = st; } int ok = 0; for (int go = cur[x]; go; go = e[go]){ if (c[go] && d[x] == d[b[go]] + 1){ ok = 1; pre[b[go]] = go; cur[x] = go; x = b[go]; break; } } if (!ok){ int tmp = n - 1; for (int go = h[x]; go; go = e[go]){ if (c[go]){ tmp = min(tmp, d[b[go]]); } } if (-- cnt[d[x]] == 0) break; d[x] = tmp + 1; cnt[d[x]] ++; cur[x] = h[x]; if (x != st) x = b[pre[x] ^ 1]; } } return ans; }