Advertisement
Guest User

flows

a guest
May 26th, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.59 KB | None | 0 0
  1.  
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4.  
  5. typedef unsigned long long ull;
  6.  
  7. const ull INF = 1e18;
  8.  
  9. #define min(a, b) ((a) > (b) ? (b) : (a))
  10.  
  11. struct edge {
  12.     int b, u, c, f, back;
  13. };
  14. vector<vector<edge>> g;
  15.  
  16. void add_edge(int a, int b, int u, int c) {
  17.     g[a].push_back ({b, u, c, 0, (int)g[b].size()});
  18.     g[b].push_back ({a, 0, -c, 0, (int)g[a].size() - 1});
  19. }
  20.  
  21. ull mincostmaxflow(int s, int t, int n) {
  22.     ull flow = 0, cost = 0;
  23.     while (1) {
  24.         vector<ull> id(n, 0), d(n, INF), q(n), p(n);
  25.         vector<ull> p_edge(n);
  26.        
  27.         int qh = 0, qt = 0;
  28.         q[qt++] = s, d[s] = 0;
  29.         while (qh != qt) {
  30.             int v = q[qh++], i = 0;
  31.             id[v] = 2;
  32.             qh %= n;
  33.             for (auto & e : g[v]) {
  34.                 if (e.f < e.u && d[v] + e.c < d[e.b]) {
  35.                     d[e.b] = d[v] + e.c;
  36.                     if (id[e.b] == 0) {
  37.                         q[qt++] = e.b;
  38.                         qt %= n;
  39.                     } else if (id[e.b] == 2) {
  40.                         if (--qh == -1)  qh = n - 1;
  41.                         q[qh] = e.b;
  42.                     }
  43.                     id[e.b] = 1, p[e.b] = v, p_edge[e.b] = i;
  44.                 }
  45.                 ++i;
  46.             }
  47.         }
  48.  
  49.         if (d[t] == INF)  break;
  50.         ull dflow = INF;
  51.         for (int v = t; v != s; v = p[v]) {
  52.             int pv = p[v], pr = p_edge[v];
  53.             dflow = min(dflow, g[pv][pr].u - g[pv][pr].f);
  54.         }
  55.         for (int v = t; v != s; v = p[v]) {
  56.             int pv = p[v], pr = p_edge[v], r = g[pv][pr].back;
  57.             g[pv][pr].f += dflow;
  58.             g[v][r].f -= dflow;
  59.             cost += g[pv][pr].c * dflow;
  60.         }
  61.         flow += dflow;
  62.     }
  63.  
  64.     return cost;
  65. }
  66.  
  67. int main() {
  68.     int n, m, a, b, c, cost;
  69.     cin >> n >> m;
  70.     g.resize(n);
  71.     while (m--) {
  72.         cin >> a >> b >> c >> cost;
  73.         --a, --b;
  74.         add_edge(a, b, c, cost);
  75.     }
  76.     cout << mincostmaxflow(0, n - 1, n);
  77.     return 0;
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement