Advertisement
Guest User

Untitled

a guest
Nov 26th, 2014
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.90 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define TASK "maxflow"
  5. #define cin ___cin___
  6. #define cout ___cout___
  7.  
  8. ifstream cin(TASK ".in");
  9. ofstream cout(TASK ".out");
  10.  
  11. struct edge
  12. {
  13. int v, to, flow, cap;
  14.  
  15. int go(int x) { return x == v ? to : v; }
  16.  
  17. edge(int v, int to, int flow, int cap)
  18. : v(v), to(to), flow(flow), cap(cap) {}
  19. };
  20.  
  21. struct graph
  22. {
  23. vector <edge> e;
  24. vector <vector <int> > g;
  25. int s = 0;
  26. int t;
  27.  
  28. int add_v() {
  29. int v = (int) g.size();
  30. g.emplace_back();
  31. return t = v;
  32. }
  33.  
  34. void add_edge(int v, int to, int cap) {
  35. g[v].push_back((int)e.size());
  36. e.emplace_back(v, to, 0, cap);
  37. g[to].push_back((int)e.size());
  38. e.emplace_back(to, v, 0, 0);
  39. }
  40.  
  41. vector <int> d;
  42. bool bfs() {
  43. d.assign(t + 1, -1);
  44. queue <int> q;
  45. q.push(s);
  46. d[s] = 0;
  47.  
  48. while (!q.empty()) {
  49. int v = q.front();
  50. q.pop();
  51.  
  52. for (int id : g[v]) {
  53. int to = e[id].go(v);
  54. if (d[to] == -1 && e[id].flow < e[id].cap) {
  55. d[to] = d[v] + 1;
  56. q.push(to);
  57. }
  58. }
  59. }
  60.  
  61. return d[t] != -1;
  62. }
  63.  
  64. vector <int> ptr;
  65. int dfs(int v, int flow = (int)1e9) {
  66. if (flow == 0 || v == t) return flow;
  67. for (int& i = ptr[v]; i < (int)g[v].size(); i++) {
  68. edge& ed = e[g[v][i]];
  69. int to = ed.go(v);
  70. if (d[v] + 1 == d[to]) {
  71. int pushed = dfs(to, min(flow, ed.cap - ed.flow));
  72. if (pushed) {
  73. ed.flow += pushed;
  74. e[g[v][i] ^ 1].cap -= pushed;
  75. return pushed;
  76. }
  77. }
  78. }
  79.  
  80. return 0;
  81. }
  82.  
  83. int dinic() {
  84. int ans = 0;
  85. while (bfs()) {
  86. ptr.assign(t + 1, 0);
  87. while (int x = dfs(0)) ans += x;
  88. }
  89. return ans;
  90. }
  91. };
  92.  
  93. void solve()
  94. {
  95. int n, m;
  96. cin >> n >> m;
  97. graph g;
  98. for (int i = 0; i < n; i++) g.add_v();
  99.  
  100. for (int i = 0; i < m; i++) {
  101. int u, v, cap;
  102. cin >> u >> v >> cap;
  103. --u; --v;
  104. g.add_edge(u, v, cap);
  105. }
  106.  
  107. cout << g.dinic() << endl;
  108. }
  109.  
  110. int main()
  111. {
  112. solve();
  113. return 0;
  114. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement