diff --git a/dinic.cpp b/dinic.cpp new file mode 100644 index 0000000..b3b22d7 --- /dev/null +++ b/dinic.cpp @@ -0,0 +1,62 @@ +const int N = 500; +const int M = 10000; + +int n, m; +struct Edge { + int v, u, c, f = 0; + Edge() {} + Edge(int v, int u, int c) : v(v), u(u), c(c) {} + int cf() { return c - f; } +} e[2 * M]; +vector g[N]; +int s, t; + +int df; + +int dist[N]; + +bool bfs() { + queue q; + q.push(s); + fill(dist, dist + n, -1); + dist[s] = 0; + while (!q.empty()) { + int v = q.front(); + q.pop(); + for (int i : g[v]) { + if (e[i].cf() >= df && dist[e[i].u] == -1) { + dist[e[i].u] = dist[v] + 1; + q.push(e[i].u); + } + } + } + return dist[t] != -1; +} + +int ptr[N]; + +bool dfs(int v) { + if (v == t) { + return true; + } + for (; ptr[v] < g[v].size(); ++ptr[v]) { + int i = g[v][ptr[v]]; + if (dist[v] + 1 == dist[e[i].u] && e[i].cf() >= df && dfs(e[i].u)) { + e[i].f += df; + e[i ^ 1].f -= df; + return true; + } + } + return false; +} + +void dinic() { + const int K = 30; + for (df = 1 << K; df >= 1; df >>= 1) { + while (bfs()) { + fill(ptr, ptr + N, 0); + while (dfs(s)) { + } + } + } +}