Dang_Quan_10_Tin

Maximum Flow Minimum Cost

Jul 18th, 2022 (edited)
1,057
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.27 KB | None | 0 0
  1. struct Edge
  2. {
  3.     int u, v;
  4.     ll c, w;
  5.     Edge(const int &u, const int &v, const ll &c, const ll &w) : u(u), v(v), c(c), w(w) {}
  6. };
  7. struct MaxFlowMinCost
  8. {
  9.     const ll Inf = 1e17;
  10.     int n, source, sink;
  11.     vector<ll> d;
  12.     vector<int> par;
  13.     vector<bool> inqueue;
  14.     vector<Edge> s;
  15.     vector<vector<int>> adj;
  16.     MaxFlowMinCost(int n)
  17.     {
  18.         this->n = n;
  19.         s.reserve(n * 2);
  20.         d.resize(n + 5);
  21.         inqueue.resize(n + 5);
  22.         par.resize(n + 5);
  23.         adj.resize(n + 5);
  24.     }
  25.     void AddEdge(int u, int v, ll c, ll w)
  26.     {
  27.         s.emplace_back(u, v, c, w);
  28.         adj[u].emplace_back(s.size() - 1);
  29.         s.emplace_back(v, u, 0, -w);
  30.         adj[v].emplace_back(s.size() - 1);
  31.     }
  32.     bool SPFA()
  33.     {
  34.         fill(d.begin(), d.end(), Inf);
  35.         fill(par.begin(), par.end(), s.size());
  36.         fill(inqueue.begin(), inqueue.end(), 0);
  37.         d[sink] = 0;
  38.         queue<int> q;
  39.         q.emplace(sink);
  40.         inqueue[sink] = 1;
  41.         while (q.size())
  42.         {
  43.             int c = q.front();
  44.             inqueue[c] = 0;
  45.             q.pop();
  46.             for (auto i : adj[c])
  47.                 if (s[i ^ 1].c > 0 && d[s[i].v] > d[c] + s[i ^ 1].w)
  48.                 {
  49.                     par[s[i].v] = i ^ 1;
  50.                     d[s[i].v] = d[c] + s[i ^ 1].w;
  51.                     if (!inqueue[s[i].v])
  52.                     {
  53.                         q.emplace(s[i].v);
  54.                         inqueue[s[i].v] = 1;
  55.                     }
  56.                 }
  57.         }
  58.         return (d[source] < Inf);
  59.     }
  60.     pair<ll, ll> MaxFlow(int so, int t, ll k)
  61.     {
  62.         source = so;
  63.         sink = t;
  64.         ll Flow(0), cost(0);
  65.         while (k && SPFA())
  66.         {
  67.             ll q(Inf);
  68.             int v = source;
  69.             while (v != sink)
  70.             {
  71.                 q = min(q, s[par[v]].c);
  72.                 v = s[par[v]].v;
  73.             }
  74.  
  75.             q = min(q, k);
  76.  
  77.             cost += d[source] * q;
  78.             Flow += q;
  79.             k -= q;
  80.  
  81.             v = source;
  82.             while (v != sink)
  83.             {
  84.                 s[par[v]].c -= q;
  85.                 s[par[v] ^ 1].c += q;
  86.                 v = s[par[v]].v;
  87.             }
  88.         }
  89.         return {Flow, cost};
  90.     }
  91. };
Add Comment
Please, Sign In to add comment