This documentation is automatically generated by online-judge-tools/verification-helper
View the Project on GitHub ningenMe/compro-library
#include <bits/stdc++.h> using namespace std; //O(F|E|) template <class T> class Ford_Fulkerson { public: struct info { int to, rev; T cap; }; T ini, inf; vector<vector<info>> edge; vector<bool> visit; Ford_Fulkerson(int N, T ini, T inf) : edge(N), visit(N), ini(ini), inf(inf) { // do nothing } void make_edge(int from, int to, T cap) { edge[from].push_back({ to, (int)edge[to].size(), cap }); edge[to].push_back({ from, (int)edge[from].size() - 1, ini }); } T dfs(int from, int goal, T flow) { if (from == goal) return flow; visit[from] = false; for (int i = 0; i < edge[from].size(); ++i) { if (visit[edge[from][i].to] && edge[from][i].cap > ini) { T dflow = dfs(edge[from][i].to, goal, min(flow, edge[from][i].cap)); if (dflow > 0) { edge[from][i].cap -= dflow; edge[edge[from][i].to][edge[from][i].rev].cap += dflow; return dflow; } } } return ini; } T maxflow(int start, int goal) { T maxflow = ini; while (1) { for (int i = 0; i < edge.size(); ++i) visit[i] = true; T flow = dfs(start, goal, inf); if (flow == ini) return maxflow; maxflow += flow; } } }; //verify https://atcoder.jp/contests/arc085/tasks/arc085_c
#line 1 "non-verified/Ford_Fulkerson.cpp" #include <bits/stdc++.h> using namespace std; //O(F|E|) template <class T> class Ford_Fulkerson { public: struct info { int to, rev; T cap; }; T ini, inf; vector<vector<info>> edge; vector<bool> visit; Ford_Fulkerson(int N, T ini, T inf) : edge(N), visit(N), ini(ini), inf(inf) { // do nothing } void make_edge(int from, int to, T cap) { edge[from].push_back({ to, (int)edge[to].size(), cap }); edge[to].push_back({ from, (int)edge[from].size() - 1, ini }); } T dfs(int from, int goal, T flow) { if (from == goal) return flow; visit[from] = false; for (int i = 0; i < edge[from].size(); ++i) { if (visit[edge[from][i].to] && edge[from][i].cap > ini) { T dflow = dfs(edge[from][i].to, goal, min(flow, edge[from][i].cap)); if (dflow > 0) { edge[from][i].cap -= dflow; edge[edge[from][i].to][edge[from][i].rev].cap += dflow; return dflow; } } } return ini; } T maxflow(int start, int goal) { T maxflow = ini; while (1) { for (int i = 0; i < edge.size(); ++i) visit[i] = true; T flow = dfs(start, goal, inf); if (flow == ini) return maxflow; maxflow += flow; } } }; //verify https://atcoder.jp/contests/arc085/tasks/arc085_c