Mlxa

Симплекс

Oct 31st, 2019
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.15 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using long_type = long long;
  3. #define long long_type
  4. #define all(x) begin(x), end(x)
  5. using namespace std;
  6.  
  7. const int   max_n       = 1 << 17;
  8. const int   int_inf     = 0x3f3f3f3f;
  9. const long  long_inf    = 0x3f3f3f3f3f3f3f3f;
  10. const int   source      = max_n - 1;
  11. const int   sink        = max_n - 2;
  12.  
  13. struct edge {
  14.     long c, f;
  15.     int u, r;
  16.     edge(int _u, long _c, int _r) :
  17.         c(_c),
  18.         f(0),
  19.         u(_u),
  20.         r(_r) {}
  21. };
  22.  
  23. struct flow {
  24.     long lim;
  25.     int ptr[max_n], dist[max_n];
  26.     vector<edge> g[max_n];
  27.     void add_edge(int v, int u, long w) {
  28.         assert(v != u);
  29.         g[v].emplace_back(u, w, (int)g[u].size());
  30.         g[u].emplace_back(v, 0, (int)g[v].size() - 1);
  31.     }
  32.     bool bfs() {
  33.         fill(all(ptr), 0);
  34.         fill(all(dist), int_inf);
  35.         queue<int> q;
  36.         q.push(source);
  37.         dist[source] = 0;
  38.         while (q.size()) {
  39.             int v = q.front();
  40.             q.pop();
  41.             for (edge e : g[v]) {
  42.                 if (e.c - e.f >= lim && dist[e.u] > dist[v] + 1) {
  43.                     dist[e.u] = dist[v] + 1;
  44.                     q.push(e.u);
  45.                 }
  46.             }
  47.         }
  48.         return dist[sink] < int_inf;
  49.     }
  50.     long dfs(int v, long mn) {
  51.         if (v == sink) {
  52.             return mn;
  53.         }
  54.         for (; ptr[v] < (int)g[v].size(); ++ptr[v]) {
  55.             edge &e = g[v][ptr[v]];
  56.             edge &r = g[e.u][e.r];
  57.             if (dist[e.u] != dist[v] + 1 || e.c - e.f < lim) {
  58.                 continue;
  59.             }
  60.             long d = dfs(e.u, min(mn, e.c - e.f));
  61.             if (d) {
  62.                 e.f += d;
  63.                 r.f -= d;
  64.                 return d;
  65.             }
  66.         }
  67.         return 0;
  68.     }
  69.     long max_flow() {
  70.         long sum = 0;
  71.         for (lim = 1; lim >= 1; lim >>= 1) {
  72.             while (bfs()) {
  73.                 long cur = dfs(source, long_inf);
  74.                 while (cur) {
  75.                     sum += cur;
  76.                     cur = dfs(source, long_inf);
  77.                 }
  78.             }
  79.         }
  80.         return sum;
  81.     }
  82. } f;
  83.  
  84.  
  85. int main() {
  86. #ifdef LC
  87.     assert(freopen("input.txt", "r", stdin));
  88. #else
  89. //~ #define TASK "maxflow"
  90.     //~ assert(freopen(TASK ".in", "r", stdin));
  91.     //~ assert(freopen(TASK ".out", "w", stdout));
  92. #endif
  93.     ios::sync_with_stdio(0);
  94.     cin.tie(0);
  95.     int n, m;
  96.     cin >> n >> m;
  97.     while (m--) {
  98.         int v, u, w;
  99.         cin >> v >> u >> w;
  100.         f.add_edge(v, u, w);
  101.     }
  102.     f.add_edge(source, 1, long_inf);
  103.     f.add_edge(n, sink, long_inf);
  104.     cout << f.max_flow() << "\n";
  105.     cerr << 1000 * clock() / CLOCKS_PER_SEC << endl;
  106.     return 0;
  107. }
Add Comment
Please, Sign In to add comment