Advertisement
Mlxa

### Максимальный поток (Диниц с масштабированием)

Feb 12th, 2019
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.86 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. #define long ll
  5. #define all(x) begin(x), end(x)
  6.  
  7. namespace flow {
  8. const int N = 512, INF = 0x3f3f3f3f;
  9. int SOURCE = N - 1, SINK = N - 2;
  10. struct Edge {
  11.     int u = 0, r = 0, c = 0, f = 0;
  12.     Edge(int aa, int bb, int cc, int dd) : u(aa), r(bb), c(cc), f(dd) {}
  13. };
  14. vector<Edge> g[N];
  15. void add(int a, int b, int c) {
  16.     g[a].emplace_back(b, (int)g[b].size(), c, 0);
  17.     g[b].emplace_back(a, (int)g[a].size() - 1, 0, 0);
  18. }
  19. int lim, dist[N], p[N];
  20. bool bfs() {
  21.     memset(dist, 0x3f, sizeof dist);
  22.     memset(p, 0x00, sizeof p);
  23.     queue<int> q;
  24.     q.push(SOURCE);
  25.     dist[SOURCE] = 0;
  26.     while (q.size()) {
  27.         int v = q.front();
  28.         q.pop();
  29.         for (auto &e : g[v]) {
  30.             if (dist[e.u] > dist[v] + 1 && e.c - e.f >= lim) {
  31.                 q.push(e.u);
  32.                 dist[e.u] = dist[v] + 1;
  33.             }
  34.         }
  35.     }
  36.     return dist[SINK] < INF;
  37. }
  38. int dfs(int v, int min_c) {
  39.     if (v == SINK) {
  40.         return min_c;
  41.     }
  42.     for (; p[v] < (int)g[v].size(); ++p[v]) {
  43.         auto &e = g[v][p[v]];
  44.         if (dist[e.u] > dist[v] && e.c - e.f >= lim) {
  45.             int d = dfs(e.u, min(min_c, e.c - e.f));
  46.             if (d > 0) {
  47.                 e.f += d;
  48.                 g[e.u][e.r].f -= d;
  49.                 return d;
  50.             }
  51.         }
  52.     }
  53.     return 0;
  54. }
  55. long find_flow() {
  56.     long answer = 0;
  57.     lim = 1;
  58.     for (lim = 1 << 30; lim > 0; lim /= 2) {
  59.         while (bfs()) {
  60.             int d = dfs(SOURCE, INF);
  61.             while (d > 0) {
  62.                 answer += d;
  63.                 d = dfs(SOURCE, INF);
  64.             }
  65.         }
  66.     }
  67.     return answer;
  68. }
  69. }
  70.  
  71. int n, m;
  72.  
  73. int main() {
  74. #ifdef LC
  75.     //assert(freopen("input.txt", "r", stdin));
  76. #endif
  77.     ios::sync_with_stdio(false);
  78.     cin.tie(nullptr);
  79.    
  80.     cin >> n >> m;
  81.     for (int a, b, c, i = 0; i < m; ++i) {
  82.         cin >> a >> b >> c;
  83.         --a;
  84.         --b;
  85.         flow::add(a, b, c);
  86.     }
  87.     flow::SOURCE = 0;
  88.     flow::SINK   = n - 1;
  89.     cout << flow::find_flow() << '\n'; 
  90.    
  91.     return 0;
  92. }
  93.  
  94. /*****
  95. Cool test:
  96. 4 5
  97. 1 2 2
  98. 1 3 1
  99. 2 3 1
  100. 2 4 1
  101. 3 4 2
  102. *****/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement