//https://codeforces.com/contest/1383/submission/98150891 #include using namespace std; const int nmax=2e3+42,MX=1e7; int pointer=0; vector adj[nmax]; pair active[MX]; void add_edge(int u,int v,int cap) { //cout< > bfs_queue,idle; void bfs() { memset(dist,-1,sizeof(dist)); bfs_queue=idle; bfs_queue.push({source,0}); while(bfs_queue.size()) { pair tp=bfs_queue.front(); bfs_queue.pop(); if(dist[tp.first]!=-1)continue; dist[tp.first]=tp.second; if(tp.first==sink)return; for(auto k:adj[tp.first]) if(active[k].second&&dist[active[k].first]==-1)bfs_queue.push({active[k].first,tp.second+1}); } } int id[nmax]; void push_flow(int id_edge,int cur) { active[id_edge].second=active[id_edge].second-cur; active[id_edge^1].second=active[id_edge^1].second+cur; } /* pointer_update++; before[pointer_update]={adj[node][id[node]],active[adj[node][id[node]]].second}; pointer_update++; before[pointer_update]={adj[node][id[node]]^1,active[adj[node][id[node]]^1].second}; active[adj[node][id[node]]].second=active[adj[node][id[node]]].second-cur; active[adj[node][id[node]]^1].second=active[adj[node][id[node]]^1].second+cur; */ int dfs(int node,int mini) { //cout<<"dfs "<