/** * Sergey Kopeliovich (burunduk30@gmail.com) */ #include using namespace std; #define forn(i, n) for (int i = 0; i < (int)(n); i++) #define all(a) (a).begin(), (a).end() struct Graph { struct Edge { int a, b, f, c, index; }; int s, t; vector> g; vector used; Graph(int n, int s, int t) : s(s), t(t), g(n), used(n) { } void addEdge(int a, int b, int c = 1) { g[a].push_back({a, b, 0, c, g[b].size()}); // f++ g[b].push_back({b, a, 0, 0, g[a].size()-1}); // f--, обратное } bool dfs(int v) { // if (v == t) return 1; used[v] = 1; // =cc for (Edge e : g[v]) // не насыщено if (e.f < e.c && (e.b == t || (!used[e.b] && dfs(e.b)))) { e.f++; обратное.f--; return 1; } return 0; } int maxFlow() { while dfs(s) } }; struct GraphOptimal { struct Edge { int a, b, f, c, next; // обычно: "a" можно не хранить // часто: вместо "f", "c" хранить c-f (если нужно только |f|) }; vector edges; vector head(n, -1); void addEdge(int a, int b, int c) { // g[a].push_back(edges.size()); edges.push_back({a, b, 0, c, head[a]}); // 2i head[a] = edges.size() - 1; // g[b].push_back(edges.size()); edges.push_back({b, a, 0, 0, head[b]}); // 2i+1 head[b] = edges.size() - 1; // int e; e --> e^1 } void dfs(int v) { for (int e = head[v]; e != -1; e = edges[e].next) ; } };