SegaMegaPro

Untitled

Nov 23rd, 2022
17
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.40 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <deque>
  4. using namespace std;
  5.  
  6.  
  7. int s, t;
  8. const int M_N = 699;
  9. const int INF = 1000000;
  10. const long long INF_FLOW = 1000000000;
  11.  
  12. struct edge
  13. {
  14. int next, capacity, flow;
  15. edge *back_edge;
  16.  
  17. edge(int next, int capacity) : next(next), capacity(capacity), flow(0) {}
  18.  
  19. int getCap()
  20. {
  21. return capacity - flow;
  22. }
  23. };
  24.  
  25. vector<edge *> g[M_N];
  26. vector<int> d(M_N);
  27. vector<int> p(M_N);
  28.  
  29.  
  30. void fill_graph(int m)
  31. {
  32. int v1, v2, cost;
  33. for (int i = 0; i < m; i++)
  34. {
  35. cin >> v1 >> v2 >> cost;
  36.  
  37. edge *e = new edge(v2, cost), *b_e = new edge(v1, 0);
  38. e->back_edge = b_e;
  39. b_e->back_edge = e;
  40.  
  41. g[v1].push_back(e);
  42. g[v2].push_back(b_e);
  43. }
  44. }
  45.  
  46.  
  47. bool bfs(int c) {
  48. d.assign(M_N, INF);
  49. d[s] = 0;
  50.  
  51. deque<int> dq;
  52. dq.push_back(s);
  53.  
  54. while (!dq.empty())
  55. {
  56. int v = dq.front();
  57. dq.pop_front();
  58.  
  59. for (edge *edge : g[v])
  60. {
  61. if (d[edge->next] == INF && edge->getCap() >= c)
  62. {
  63. d[edge->next] = d[v] + 1;
  64. dq.push_back(edge->next);
  65. }
  66. }
  67. }
  68. return d[t] != INF;
  69. }
  70.  
  71. int dfs(int v, int flow)
  72. {
  73. if (v == t)
  74. {
  75. return flow;
  76. }
  77. if (flow == 0)
  78. {
  79. return 0;
  80. }
  81. for (int i = p[v]; i < g[v].size(); ++i)
  82. {
  83. edge *edge = g[v][i];
  84.  
  85. if (d[edge->next] != d[v] + 1)
  86. continue;
  87.  
  88. int flow_f;
  89. if (flow_f = dfs(edge->next, min(edge->getCap(), flow))) {
  90. edge->flow += flow_f;
  91. edge->back_edge->flow -= flow_f;
  92.  
  93. return flow_f;
  94. }
  95. p[v]++;
  96. }
  97.  
  98. return 0;
  99. }
  100.  
  101. long long alg_dinic(int c)
  102. {
  103. long long flow = 0;
  104. while (bfs(c) > 0) {
  105. p.assign(M_N, 0);
  106. long long temp_flow;
  107. while (temp_flow = dfs(1, INF_FLOW))
  108. {
  109. flow += temp_flow;
  110. }
  111. }
  112.  
  113. return flow;
  114. }
  115.  
  116. long long find_max_flow(int m_c, long m_f)
  117. {
  118. while (m_c) {
  119. m_f += alg_dinic(m_c);
  120. m_c /= 2;
  121. }
  122. return m_f;
  123. }
  124.  
  125. int main() {
  126. int n, m;
  127. cin >> n >> m;
  128.  
  129. fill_graph(m);
  130.  
  131. s = 1, t = n;
  132.  
  133. int max_c = INF_FLOW;
  134. long long max_f = 0;
  135.  
  136.  
  137. cout << find_max_flow(max_c, max_f)<< endl;
  138.  
  139. return 0;
  140. }
Add Comment
Please, Sign In to add comment