fork download
  1. #include <bits/stdc++.h> // NeOWami
  2. using namespace std;
  3.  
  4. #define ft first
  5. #define sc second
  6.  
  7. struct Dinic {
  8. struct Edge {
  9. int v, rev;
  10. long long cap, flow;
  11. };
  12. long long INF = 4e18;
  13. int N;
  14. vector<vector<Edge>> G;
  15. vector<int> level, curEdge;
  16. Dinic (int n = 0) {
  17. init(n);
  18. };
  19. void init(int n) {
  20. N = n;
  21. G.assign(n, {});
  22. }
  23. void addEdge(int u, int v, long long cap) {
  24. Edge a{v, (int)G[v].size(), cap, 0};
  25. Edge b{u, (int)G[u].size(), 0, 0};
  26. G[u].push_back(a);
  27. G[v].push_back(b);
  28. }
  29.  
  30. bool bfs(int s, int t) {
  31. level.assign(N, -1);
  32. level[s] = 0;
  33. queue<int> Q;
  34. Q.push(s);
  35.  
  36. while(!Q.empty() && level[t] == -1) {
  37. int u = Q.front(); Q.pop();
  38. for (Edge &e: G[u]) {
  39. if (e.cap > e.flow && level[e.v] == -1) {
  40. level[e.v] = level[u] + 1;
  41. Q.push(e.v);
  42. }
  43. }
  44. }
  45. return level[t] != -1;
  46. }
  47. long long dfs(int u, int t, long long f) {
  48. if (!f || u == t) return f;
  49. for (int &i = curEdge[u]; i < (int)G[u].size(); i++) {
  50. Edge &e = G[u][i];
  51. if (e.cap > e.flow && level[e.v] == level[u] + 1) {
  52. long long val = dfs(e.v, t, min(f, e.cap - e.flow));
  53. if (val) {
  54. e.flow += val;
  55. G[e.v][e.rev].flow -= val;
  56. return val;
  57. }
  58. }
  59. }
  60. return 0;
  61. }
  62. long long maxFlow(int s, int t) {
  63. long long flow = 0;
  64. while(bfs(s, t)) {
  65. curEdge.assign(N, 0);
  66. while(long long f = dfs(s, t, INF)) {
  67. flow += f;
  68. }
  69. }
  70. return flow;
  71. }
  72. };
  73. signed main() {
  74. cin.tie(NULL)->sync_with_stdio(false);
  75. if(ifstream("Input.inp")) {
  76. freopen("Input.inp", "r", stdin);
  77. freopen("Output.out", "w", stdout);
  78. }
  79.  
  80. return 0;
  81. }
Success #stdin #stdout 0.01s 5288KB
stdin
Standard input is empty
stdout
Standard output is empty