keker123

Untitled

Dec 24th, 2023 (edited)
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.07 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <set>
  5.  
  6. using namespace std;
  7.  
  8. const int X = 1e5 + 20;
  9. const int Inf = 1e9 + 7;
  10.  
  11. struct Edge {
  12.     Edge() = default;
  13.     Edge(int x, int c, int cap, int ind) : to(x), cost(c), capacity(cap), reverse(ind), flow(0) {};
  14.  
  15.     int to;
  16.     int cost;
  17.     int capacity;
  18.     int reverse;
  19.     int flow;
  20. };
  21.  
  22. vector<Edge> edges;
  23.  
  24. vector<int> nec;
  25.  
  26. vector<vector<int>> g(X);
  27. vector<int> dists(X, Inf);
  28. vector<int> P(X, 0);
  29.  
  30. int delta(Edge k) {
  31.     return k.capacity - k.flow;
  32. }
  33.  
  34. void add(int v, int u, int c = 0, int cap = 1, bool isMin = false) {
  35.     Edge x(u, c, cap, edges.size() + 1);
  36.     Edge y(v, -c, 0, edges.size());
  37.     g[v].push_back(edges.size());
  38.     g[u].push_back(edges.size() + 1);
  39.     edges.push_back(x);
  40.     if (isMin) {
  41.         nec.push_back(edges.size() - 1);
  42.     }
  43.     edges.push_back(y);
  44. }
  45.  
  46. bool dj(int s, int t) {
  47.     dists.assign(X, Inf);
  48.     set<pair<int, int>> d;
  49.     d.insert({0, s});
  50.     dists[s] = 0;
  51.     while (!d.empty()) {
  52.         auto x = *d.begin();
  53.         int v = x.second;
  54.         for (auto to: g[v]) {
  55.             auto &e = edges[to];
  56.             if (delta(e)) {
  57.                 int x = dists[v] + e.cost + P[v] - P[e.to];
  58.                 if (dists[e.to] > x) {
  59.                     d.erase({dists[e.to], e.to});
  60.                     dists[e.to] = x;
  61.                     d.insert({x, e.to});
  62.  
  63.                 }
  64.             }
  65.         }
  66.         d.erase(d.begin());
  67.     }
  68.     for (int i = 0; i < X; i++) {
  69.         if (dists[i] != Inf) {
  70.             P[i] += dists[i];
  71.         }
  72.     }
  73.     return dists[t] < Inf;
  74. }
  75.  
  76.  
  77. int dfsW(int v, int t, vector<bool> &used, int fl = Inf) {
  78.     if (v == t) {
  79.         return fl == Inf ? 0 : fl;
  80.     }
  81.     used[v] = true;
  82.     for (auto to: g[v]) {
  83.         auto &e = edges[to];
  84.         if (!used[e.to] && delta(e) && e.cost + P[v] - P[e.to] == 0) {
  85.             int x = dfsW(e.to, t, used, min(fl, delta(e)));
  86.             if (x) {
  87.                 e.flow += x;
  88.                 edges[e.reverse].flow -= x;
  89.                 return x;
  90.             }
  91.         }
  92.     }
  93.     return 0;
  94. }
  95.  
  96. pair<int, int> MCMF(int s, int t) {
  97.     vector<bool> used(X, false);
  98.     int ans = 0;
  99.     while (dj(s, t)) {
  100.         dfsW(s, t, used);
  101.         used.assign(X, false);
  102.     }
  103.  
  104.     for (int i = 0; i < X; i++) {
  105.         for (auto to: g[i]) {
  106.             auto &e = edges[to];
  107.             ans += e.flow * e.cost;
  108.         }
  109.     }
  110.  
  111.     int flow = 0;
  112.     for (auto x : g[s]) {
  113.         auto k = edges[x];
  114.         flow += k.flow;
  115.     }
  116.  
  117.     return {flow, ans / 2};
  118. }
  119.  
  120. int main() {
  121.     int n, m;
  122.     cin >> n >> m;
  123.     for (int i = 0; i < m; ++i) {
  124.         int v, u;
  125.         cin >> v >> u;
  126.         int c, l;
  127.         cin >> c >> l;
  128.         add(v, u, 0, l, true);
  129.         add(v, u, 1, c - l);
  130.     }
  131.  
  132.     auto result = MCMF(1, n);
  133.     for (auto ptr : nec) {
  134.         if (edges[ptr].flow != edges[ptr].capacity) {
  135.             cout << -1 << endl;
  136.             return 0;
  137.         }
  138.     }
  139.     cout << result.first << endl;
  140.     return 0;
  141. }
  142.  
Advertisement
Add Comment
Please, Sign In to add comment