Guest User

Untitled

a guest
Aug 20th, 2018
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.26 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define DEBUG 1
  6. #define debug if(DEBUG)
  7. #define cdbg debug cerr
  8.  
  9. const int INF = 1000000000;
  10.  
  11. struct edge {
  12. int from, to, cap, flow = 0;
  13. edge *rev;
  14.  
  15. edge() {}
  16. edge(int from, int to, int cap) : from(from), to(to), cap(cap), rev(nullptr) {}
  17. edge(int from, int to, int cap, edge *rev) : from(from), to(to), cap(cap), rev(rev) {}
  18. };
  19.  
  20. int n, m;
  21. vector<edge> e;
  22. vector<vector<int> > g;
  23. vector<int> d, q, ptr;
  24.  
  25. void addEdge(int u, int v, int c) {
  26. edge a = edge(u, v, c);
  27. edge b = edge(v, u, 0, &a);
  28. a.rev = &b;
  29.  
  30. g[u].push_back(e.size());
  31. e.push_back(a);
  32. g[v].push_back(e.size());
  33. e.push_back(b);
  34. }
  35.  
  36. bool bfs(int s, int t) {
  37. d.assign(n, -1);
  38. q.resize(n);
  39. int qs = 0, qf = 0;
  40. d[s] = 0;
  41. q[qf++] = s;
  42. while(qs < qf) {
  43. int v = q[qs++];
  44. for(auto x : g[v]) {
  45. if(d[e[x].to] == -1 && e[x].flow < e[x].cap) {
  46. q[qf++] = e[x].to;
  47. d[e[x].to] = d[v] + 1;
  48. }
  49. }
  50. }
  51. return d[t] != -1;
  52. }
  53.  
  54. int dfs(int v, int t, int flow) {
  55. if(!flow) return 0;
  56. if(v == t) return flow;
  57. for(; ptr[v] < g[v].size(); ++ptr[v]) {
  58. edge *x = &e[g[v][ptr[v]]];
  59. if(d[x->to] == d[v] + 1) {
  60. int curflow = dfs(x->to, t, min(flow, x->cap - x->flow));
  61. if(curflow) {
  62. x->flow += curflow;
  63. x->rev->flow -= curflow;
  64. return curflow;
  65. }
  66. }
  67. }
  68. return 0;
  69. }
  70.  
  71. int findFlow(int s, int t) {
  72. int flow = 0;
  73. while(bfs(s, t)) {
  74. ptr.assign(n, 0);
  75. while(int df = dfs(s, t, INF)) {
  76. flow += df;
  77. }
  78. }
  79. return flow;
  80. }
  81.  
  82. int32_t main() {
  83. #ifdef DARKKEKS
  84. freopen("input.txt", "r", stdin);
  85. // freopen("output.txt", "w", stdout);
  86. #else
  87. freopen("flow.in", "r", stdin);
  88. freopen("flow.out", "w", stdout);
  89. ios_base::sync_with_stdio(false);
  90. cin.tie(0);
  91. #endif
  92.  
  93. cin >> n >> m;
  94. g.resize(n);
  95.  
  96. int s, t;
  97. cin >> s >> t;
  98. s--, t--;
  99.  
  100. int u, v, c;
  101. for(int i = 0; i < m; ++i) {
  102. cin >> u >> v >> c;
  103. u--, v--;
  104. addEdge(u, v, c);
  105. }
  106.  
  107. cout << findFlow(s, t) << "\n";
  108. for(int i = 0; i < e.size(); i += 2) {
  109. cout << e[i].flow << "\n";
  110. }
  111. }
Add Comment
Please, Sign In to add comment