--- tags: Graph Theory title: Maximum Flow --- ## Dinic's Algorithm ### Sample Code ```cpp struct Dinic { Dinic(size_t N, int s, int t) : N(N), s(s), t(t), adj(N) {} struct Edge { int to; int cap; int rev; Edge(int to, int cap, int rev) : to(to), cap(cap), rev(rev) {} }; size_t N; int s, t; vector<vector<Edge>> adj; vector<int> level; vector<size_t> index; void add_edge(int from, int to, int capacity) { adj[from].emplace_back(to, capacity, adj[to].size()); adj[to].emplace_back(from, 0, adj[from].size() - 1); } bool bfs() { level.assign(N, -1); deque<int> q(1, s); level[s] = 0; while (!q.empty()) { int u = q.front(); q.pop_front(); for (auto& e : adj[u]) { if (e.cap > 0 && level[e.to] < 0) { level[e.to] = level[u] + 1; q.push_back(e.to); } } } return level[t] >= 0; } int dfs(int u, int flow) { if (u == t) return flow; for (auto& i = index[u]; i < adj[u].size(); ++i) { auto& e = adj[u][i]; if (e.cap > 0 && level[e.to] > level[u]) { int ret = dfs(e.to, min(flow, e.cap)); if (ret > 0) { e.cap -= ret; adj[e.to][e.rev].cap += ret; return ret; } } } return 0; } int max_flow() { int flow = 0; while (true) { if (!bfs()) return flow; index.assign(N, 0); int f; while ((f = dfs(0, 0x3fffffff)) > 0) { flow += f; } } } }; ```