struct Graph { vector head, head0; vector edges; struct Edge { int a, b, f, c, next; }; int k, cc; vector used; // s --> t (c-f>=2^k) int dfs(int v, int x) { used[v] = cc; while (head[v] != -1) { auto e = edges[head[v]]; if (dist[e.b] == dist[e.a]+1 && e.f + (1< e.c && (e.b == t || (used[e.b] != cc) && (x = dfs(e.b, min(x, e.c-e.f)))) > 0) { e.f += x; edges[head[v]^1].f -= x; return 1; } // Удалить! head[v] = edges[head[v]].next; } return 0; } void Dinic() { for k { // 2^k head0 = head; while (bfs()) { // dist head = head0; cc++ while (dfs(s, INT_MAX)) cc++ } } } };