DSA
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

72 lines
1.3 KiB

  1. #include <bits/stdc++.h>
  2. #define pb push_back
  3. #define int long long
  4. using namespace std ;
  5. const long long MAXN = 1e9+1 ;
  6. const int N = (int)(2e4) + 256 ;
  7. int n , m , timer , used[N] , lim ;
  8. struct edge{
  9. int v , u , c , f ;
  10. };
  11. vector <edge> e ;
  12. vector <int> g[N] ;
  13. inline void addEdge(int v , int u , int c )
  14. {
  15. e.pb({v,u,c,0}) ;
  16. g[v].pb(e.size()-1) ;
  17. e.pb({u,v,0,0}) ;
  18. g[u].pb(e.size()-1) ;
  19. }
  20. int dfs ( int v , int t , int pushed = MAXN , int p = -1 )
  21. {
  22. if (used[v] == timer || pushed < lim) return 0;
  23. if (!pushed || v == t) return pushed;
  24. used[v] = timer ;
  25. for ( int i = 0 ; i < g[v].size() ; ++i )
  26. {
  27. int id = g[v][i] ;
  28. int to = e[id].u , f = e[id].f , c = e[id].c ;
  29. if ( p == to || f == c ) continue ;
  30. int nxt = dfs ( to , t , min ( pushed , c - f) , v);
  31. if ( nxt > 0 )
  32. {
  33. e[id].f += nxt ;
  34. e[id^1].f -= nxt ;
  35. return nxt ;
  36. }
  37. }
  38. return 0 ;
  39. }
  40. inline int fordf(int s,int t)
  41. {
  42. int res = 0 ;
  43. lim = 1 << 30 ;
  44. while ( lim > 0 )
  45. {
  46. ++timer ;
  47. int pushed = dfs(s,t) ;
  48. if ( !pushed )
  49. {
  50. lim >>= 1 ;
  51. continue ;
  52. }
  53. res += pushed ;
  54. }
  55. return res ;
  56. }
  57. main()
  58. {
  59. freopen("flow.in","r",stdin) ;
  60. freopen("flow.out","w",stdout) ;
  61. cin >> n >> m ;
  62. for ( int i = 0 ; i < m ; ++i )
  63. {
  64. int x , y , c ;
  65. cin >> x >> y >> c ;
  66. addEdge(x,y,c) ;
  67. }
  68. cout << fordf(1,n) << endl ;
  69. return 0 ;
  70. }