Advertisement
Guest User

Untitled

a guest
Jan 16th, 2019
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.41 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define mp make_pair
  4. #define mt make_tuple
  5. #define all(x) (x).begin(), (x).end()
  6. #define rall(x) (x).rbegin(), (x).rend()
  7. #define sz(x) int((x).size())
  8.  
  9. using namespace std;
  10.  
  11. mt19937 gen_rand;
  12.  
  13. /*OUTPUT*/
  14. /*PAIR*/
  15. template<typename T, typename U>
  16. ostream &operator<<(ostream &os, pair<T, U> &a) {
  17.     os << "(";
  18.     os << a.first << ", ";
  19.     os << a.second;
  20.     os << ")";
  21.     return os;
  22. }
  23. /*PAIR*/
  24.  
  25. /*ARR*/
  26. template<typename T>
  27. ostream &operator<<(ostream &os, vector<T> &a) {
  28.     os << "{";
  29.     bool was = false;
  30.     for (auto &x: a) {
  31.         if (was) {
  32.             os << ", ";
  33.         }
  34.         was = true;
  35.         os << x;
  36.     }
  37.     os << "}";
  38.     return os;
  39. }
  40. /*ARR*/
  41. /*OUTPUT*/
  42.  
  43. /*DEBUG*/
  44. template<typename T>
  45. inline void debug(const char* sdbg, T x) {
  46.     cerr << "The value of " << sdbg << " is " << x << "\n";
  47. };
  48.  
  49. template<typename T, typename... U>
  50. inline void debug(const char* sdbg, T h, U... t) {
  51.     cerr << "The value of ";
  52.     while (*sdbg != ',') {
  53.         cerr << *sdbg++;
  54.     }
  55.     cerr << " is " << h << "\n";
  56.     debug(sdbg + 1, t...);
  57.     cerr << "\n";
  58. }
  59.  
  60. #define value(...) debug(#__VA_ARGS__, __VA_ARGS__)
  61. /*DEBUG*/
  62.  
  63. template<typename T>
  64. T abs(T x) {
  65.     if (x < 0) {
  66.         return -x;
  67.     } else {
  68.         return x;
  69.     }
  70. }
  71.  
  72. template<typename T>
  73. T sqr(T x) {
  74.     return x * x;
  75. };
  76.  
  77. const long long INF_FOR_SHORT_TIME = (long long)(1e9);
  78.  
  79. template<typename T>
  80. T mul(T a, T b, T m) {
  81.     if (a <= INF_FOR_SHORT_TIME && b <= INF_FOR_SHORT_TIME) {
  82.         return (a * b) % m;
  83.     }
  84.     T q = (long long)((long double)a * (long double)b / (long double)m);
  85.     T r = a * b - q * m;
  86.     return (r + 5 * m) % m;
  87. }
  88.  
  89. template<typename T, typename U>
  90. T binpow(T a, U n, T MOD) {
  91.     T res = 1;
  92.     while (n) {
  93.         if (n & 1) {
  94.             res = mul(res, a, MOD);
  95.         }
  96.         a = mul(a, a, MOD);
  97.         n >>= 1;
  98.     }
  99.     return res;
  100. };
  101.  
  102. template<typename T>
  103. int sign(T x) {
  104.     if (x < 0) {
  105.         return -1;
  106.     } else if (x > 0) {
  107.         return 1;
  108.     } else {
  109.         return 0;
  110.     }
  111. };
  112.  
  113. template<typename T>
  114. T gcd(T a, T b) {
  115.     if (a > b) {
  116.         swap(a, b);
  117.     }
  118.     while (a) {
  119.         b %= a;
  120.         swap(a, b);
  121.     }
  122.     return b;
  123. };
  124.  
  125. template<typename T>
  126. bool uin(T &a, T b) {
  127.     if (a > b) {
  128.         a = b;
  129.         return true;
  130.     }
  131.     return false;
  132. };
  133.  
  134. template<typename T>
  135. bool uax(T &a, T b) {
  136.     if (a < b) {
  137.         a = b;
  138.         return true;
  139.     }
  140.     return false;
  141. };
  142.  
  143. typedef unsigned int uint;
  144. typedef unsigned long long ull;
  145. typedef long long ll;
  146. typedef long double ld;
  147.  
  148. /*curlink v1.7*/
  149.  
  150. const ll INF = ll(1e9) + 7;
  151.  
  152. struct edge {
  153.     ll u, c, f;
  154.     edge *r;
  155.  
  156.     edge() :
  157.         u(-1),
  158.         c(0),
  159.         f(0),
  160.         r(nullptr) {}
  161.  
  162.     edge(ll u, ll c, ll f) :
  163.         u(u),
  164.         c(c),
  165.         f(f),
  166.         r(nullptr) {}
  167. };
  168.  
  169. ll n, m, s, t;
  170. vector<vector<edge*>> g;
  171. vector<ll> ptr, dist;
  172.  
  173. void add(ll v, ll u, ll cap) {
  174.     g[v].push_back(new edge(u, cap, 0));
  175.     g[u].push_back(new edge(v, 0, 0));
  176.     g[v].back()->r = g[u].back();
  177.     g[u].back()->r = g[v].back();
  178. }
  179.  
  180. void read() {
  181.     cin >> n >> m;
  182.     g.resize(n);
  183.     ptr.resize(n, -1);
  184.     dist.resize(n, -1);
  185.     for (ll i = 0; i < m; ++i) {
  186.         ll u, v, cap;
  187.         cin >> u >> v >> cap;
  188.         --u; --v;
  189.         add(u, v, cap);
  190.     }
  191.     s = 0;
  192.     t = n - 1;
  193. }
  194.  
  195. bool bfs(ll x) {
  196.     for (ll v = 0; v < n; ++v) {
  197.         dist[v] = INF;
  198.         ptr[v] = 0;
  199.     }
  200.     queue<ll> qr;
  201.     qr.push(s);
  202.     dist[s] = 0;
  203.     while (!qr.empty()) {
  204.         ll v = qr.front();
  205.         qr.pop();
  206.         for (auto e : g[v]) {
  207.             if (e->c - e->f >= x && dist[e->u] == INF) {
  208.                 dist[e->u] = dist[v] + 1;
  209.                 qr.push(e->u);
  210.             }  
  211.         }
  212.     }
  213.     return dist[t] != INF;
  214. }
  215.  
  216. ll dfs(ll v, ll flow, ll x) {
  217.     if (!flow || v == t) {
  218.         return flow;
  219.     }
  220.     for (; ptr[v] < sz(g[v]); ++ptr[v]) {
  221.         auto e = g[v][ptr[v]];
  222.         if (dist[v] + 1 != dist[e->u] || e->c - e->f < x) {
  223.             continue;
  224.         }
  225.         ll cur = dfs(e->u, min(flow, e->c - e->f), x);
  226.         if (cur) {
  227.             e->f += cur;
  228.             e->r->f -= cur;
  229.             return cur;
  230.         }
  231.     }
  232.     return 0;
  233. }
  234.  
  235. ll dinic() {
  236.     ll flow = 0;
  237.     for (ll x = INF; x > 0; x /= 2) {
  238.         while (bfs(x)) {
  239.             ll pushed = dfs(s, INF, x);
  240.             while (pushed) {
  241.                 flow += pushed;  
  242.                 pushed = dfs(s, INF, x);
  243.             }  
  244.         }
  245.     }
  246.     return flow;
  247. }
  248.  
  249. int main() {
  250.     gen_rand.seed(time(0));
  251.     ios_base::sync_with_stdio(false);
  252.     cin.tie(nullptr);
  253.     cout.tie(nullptr);
  254.     read();
  255.     cout << dinic();
  256.     return 0;
  257. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement