Advertisement
supremeXD

Flow

Dec 23rd, 2020
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.25 KB | None | 0 0
  1. // #define _CRT_SECURE_NO_WARNINGS
  2. // ░░░░░░░▄▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▄░░░░░░
  3. // ░░░░░░█░░▄▀▀▀▀▀▀▀▀▀▀▀▀▀▄░░█░░░░░
  4. // ░░░░░░█░█░▀░░░░░▀░░▀░░░░█░█░░░░░
  5. // ░░░░░░█░█░░░░░░░░▄▀▀▄░▀░█░█▄▀▀▄░
  6. // █▀▀█▄░█░█░░▀░░░░░█░░░▀▄▄█▄▀░░░█░
  7. // ▀▄▄░▀██░█▄░▀░░░▄▄▀░░░░░░░░░░░░▀▄
  8. // ░░▀█▄▄█░█░░░░▄░░█░░░▄█░░░▄░▄█░░█
  9. // ░░░░░▀█░▀▄▀░░░░░█░██░▄░░▄░░▄░███
  10. // ░░░░░▄█▄░░▀▀▀▀▀▀▀▀▄░░▀▀▀▀▀▀▀░▄▀░
  11. // ░░░░█░░▄█▀█▀▀█▀▀▀▀▀▀█▀▀█▀█▀▀█░░░
  12. // ░░░░▀▀▀▀░░▀▀▀░░░░░░░░▀▀▀░░▀▀░░░░
  13. #include <algorithm>
  14. #include <array>
  15. #include <bitset>
  16. #include <chrono>
  17. #include <cmath>
  18. #include <cstdio>
  19. #include <cstring>
  20. #include <ctime>
  21. #include <deque>
  22. #include <fstream>
  23. #include <iostream>
  24. #include <map>
  25. #include <numeric>
  26. #include <queue>
  27. #include <random>
  28. #include <set>
  29. #include <stack>
  30. #include <string>
  31. #include <unordered_map>
  32. #include <unordered_set>
  33. #include <vector>
  34. //#pragma GCC optimize("Ofast,inline,unroll-loops,no-stack-protector,O2")
  35. //#pragma GCC target("avx,avx2,fma")
  36. using namespace std;
  37. #define rep(i, a, n) for (int i = a; i < n; i++)
  38. #define per(i, a, n) for (int i = n - 1; i >= a; i--)
  39. #define all(v) v.begin(), v.end()
  40. //#define sz(v) ((int)(v).size())
  41. #define trav(a, x) for (auto& a: x)
  42. typedef long long ll;
  43. typedef unsigned long long ull;
  44. typedef vector<int> vi;
  45. typedef vector<ll> vll;
  46. //const int INF = 1e9;
  47. const int MOD = 1e9 + 9;
  48. const int di[4] = { 1, 0, -1, 0 };
  49. const int dj[4] = { 0, 1 ,0, -1 };
  50. mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
  51.  
  52. // открытка - D, G
  53. // спбгу - F, G, H, I
  54.  
  55. struct edge {
  56. int a, b, cap, flow; //flow - поток, который точно течет
  57. };
  58.  
  59. const int MAXN = 1000, INF = 1000000007;
  60. int n, s, t;
  61. vector<int> d, ptr;
  62. vector<edge> e; //список ребер - главный
  63. vector<int> g[MAXN]; //список смежности
  64.  
  65. void add_edge(int a, int b, int cap) { //a -> b вес cap
  66. edge e1 = { a, b, cap, 0 }; //прямое
  67. edge e2 = { b, a, 0, 0 }; //обратное (техническое)
  68. g[a].push_back((int)e.size()); //индекс, где в e находится ребро
  69. e.push_back(e1); //прямое ребро имеет четный индекс
  70. g[b].push_back((int)e.size());
  71. e.push_back(e2); //обратное ребро имеет нечетный индекс
  72. }
  73.  
  74. bool bfs() {
  75. queue<int>q;
  76. q.push(s);
  77. d.assign(n, -1);
  78. d[s] = 0;
  79. while (q.size() > 0 && d[t] == -1) {
  80. int v = q.front(); q.pop();
  81. for (size_t i = 0; i < g[v].size(); ++i) {
  82. int id = g[v][i],
  83. to = e[id].b;
  84. if (d[to] == -1 && e[id].flow < e[id].cap) {
  85. q.push(to);
  86. d[to] = d[v] + 1;
  87. }
  88. }
  89. }
  90. return d[t] != -1;
  91. }
  92.  
  93. int dfs(int v, int flow) {
  94. if (!flow) return 0;
  95. if (v == t) return flow;
  96. for (; ptr[v] < (int)g[v].size(); ++ptr[v]) {
  97. int id = g[v][ptr[v]],
  98. to = e[id].b;
  99. if (d[to] != d[v] + 1) continue;
  100. int pushed = dfs(to, min(flow, e[id].cap - e[id].flow));
  101. if (pushed) {
  102. e[id].flow += pushed;
  103. e[id ^ 1].flow -= pushed;
  104. return pushed;
  105. }
  106. }
  107. return 0;
  108. }
  109.  
  110. ll dinic() {
  111. ll flow = 0; //итоговый поток
  112. while (true) {
  113. if (!bfs()) break; //строим остаточную сеть s ->t
  114. ptr.assign(n, 0);
  115. while (int pushed = dfs(s, INF)) {
  116. flow += pushed;
  117. }
  118. }
  119. return flow;
  120. }
  121.  
  122. // s - исток
  123. // t - сток
  124. // n - кол-во вершин
  125.  
  126. int main() {
  127. ios_base::sync_with_stdio(0);
  128. cin.tie(0);
  129. cout.tie(0);
  130. int m; cin >> n >> m;
  131. rep(i, 0, m) {
  132. int a, b, c; cin >> a >> b >> c;
  133. add_edge(a - 1, b - 1, c);
  134. }
  135. s = 0, t = n - 1;
  136. cout << dinic() << "\n";
  137. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement