int dinic(int nodes, int source, int sink) { int flow, max_flow = 0; while (dinic_bfs(nodes, source, sink)) { std::fill(ptr, ptr + nodes, 0); while ((flow = dinic_dfs(source, INF, sink)) != 0) { max_flow += flow; } } return max_flow; }
int dinic_dfs(int u, int f, int sink) { if (u == sink) { return f; } for (; ptr[u] < (int)adj[u].size(); ptr[u]++) { edge &e = adj[u][ptr[u]]; if (dist[e.v] == dist[u] + 1 && e.f < e.cap) { int flow = dinic_dfs(e.v, std::min(f, e.cap - e.f), sink); if (flow > 0) { e.f += flow; adj[e.v][e.rev].f -= flow; return flow; } } } return 0; }
flow[i^1]-=tmp; return tmp; } } return 0; } int dinic_flow() { for (int i=0; i<nedge; ++i) flow[i] = 0; int result=0; while (dinic_bfs()) { for (int i=0;i<node;i++) work[i]=head[i]; while (1) { int delta=dinic_dfs(src,oo); if (delta==0) break; result+=delta; } } return result; }
dist[dest]>=0; } int dinic_dfs(int x,int exp) { if (x==dest) return exp; for (int &i=work[x];i>=0;i=next[i]) { int v=point[i],tmp; if (flow[i]<capa[i] && dist[v]==dist[x]+1 && (tmp=dinic_dfs(v,min(exp,capa[i]-flow[i])))>0) { flow[i]+=tmp; flow[i^1]-=tmp; return tmp; } } return 0; } int dinic_flow() {