osipyonok

Dinic Max Flow

May 10th, 2017
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.53 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. #define INF 1000010000
  4. #define nl '\n'
  5. #define pb push_back
  6. #define ppb pop_back
  7. #define mp make_pair
  8. #define fi first
  9. #define se second
  10. #define pii pair<int,int>
  11. #define pdd pair<double,double>
  12. #define all(c) (c).begin(), (c).end()
  13. #define SORT(c) sort(all(c))
  14. #define sz(c) (c).size()
  15. #define rep(i,n) for( int i = 0; i < n; ++i )
  16. #define repi(i,n) for( int i = 1 ; i <= n; ++i )
  17. #define repn(i,n) for( int i = n - 1 ; i >= 0 ; --i )
  18. #define repf(j,i,n) for( int j = i ; j < n ; ++j )
  19. #define die(s) {std::cout << s << nl;}
  20. #define dier(s) {std::cout << s; return 0;}
  21. #define vi vector<int>
  22. typedef long long ll;
  23.  
  24. using namespace std;
  25.  
  26. struct Edge{
  27.     int u , v;
  28.     ll cap , flow;
  29.     Edge() {}
  30.     Edge(int _u , int _v , ll _c){
  31.         u = _u;
  32.         v = _v;
  33.         cap = _c;
  34.         flow = 0;
  35.     }
  36. };
  37.  
  38.  
  39. struct DinicFlow{
  40.     int n;
  41.     vector<Edge> e;
  42.     vector<vi> g;
  43.     vi d , pt;
  44.    
  45.     DinicFlow(int _n){
  46.         n = _n;
  47.         g.resize(n);
  48.         d.resize(n);
  49.         pt.resize(n);
  50.     }
  51.    
  52.     void addEdge(int u , int v , ll cap){
  53.         if(u != v){
  54.             e.pb(Edge(u , v , cap));
  55.             e.pb(Edge(v , u , 0));
  56.             g[u].pb(sz(e) - 2);
  57.             g[v].pb(sz(e) - 1);
  58.         }
  59.     }
  60.    
  61.     bool bfs(int s , int t){
  62.         queue<int> q;
  63.         q.push(s);
  64.        
  65.         d = vi(n , INF);
  66.         d[s] = 0;
  67.        
  68.         while(sz(q)){
  69.             int u = q.front();
  70.             q.pop();
  71.            
  72.             if(u == t)break;
  73.            
  74.             rep(i , sz(g[u])){
  75.                 int k = g[u][i];
  76.                 Edge &edge = e[k];
  77.                 if(edge.flow < edge.cap && d[edge.v] > d[edge.u] + 1){
  78.                     q.push(edge.v);
  79.                     d[edge.v] = d[edge.u] + 1;
  80.                 }
  81.             }
  82.         }
  83.        
  84.         return d[t] != INF;
  85.     }
  86.    
  87.     ll dfs(int u , int t , ll flow = -1){
  88.         if(u == t || flow == 0)return flow;
  89.         for(int & i = pt[u] ; i < sz(g[u]) ; ++i){
  90.             int k = g[u][i];
  91.             Edge &edge = e[k];
  92.             Edge &oedge = e[k ^ 1];
  93.             if(d[edge.v] == d[edge.u] + 1){
  94.                 ll a = edge.cap - edge.flow;
  95.                 if(flow != -1){
  96.                     a = min(a , flow);
  97.                 }
  98.                 if(ll pushed = dfs(edge.v , t , a)){
  99.                     edge.flow += pushed;
  100.                     oedge.flow -= pushed;
  101.                     return pushed;
  102.                 }
  103.                
  104.             }
  105.         }
  106.         return 0;
  107.     }
  108.    
  109.     ll MaxFlow(int s , int t){
  110.         ll total = 0;
  111.         while(bfs(s , t)){
  112.             pt = vi(n , 0);
  113.             while(ll flow = dfs(s , t)){
  114.                 total += flow;
  115.             }
  116.         }
  117.         return total;
  118.     }
  119. };
  120.  
  121. int main() {
  122.     ios_base::sync_with_stdio(false);
  123.     cin.tie(NULL);
  124.     cout.precision(0);
  125.  
  126.     int n , m;
  127.     cin >> n >> m;
  128.    
  129.     DinicFlow dinic(n);
  130.    
  131.     rep(i , m){
  132.         int u , v;
  133.         ll c;
  134.         cin >> u >> v >> c;
  135.         --u;
  136.         --v;
  137.         dinic.addEdge(u , v , c);
  138.         dinic.addEdge(v , u , c);
  139.     }
  140.     cout << dinic.MaxFlow(0 , n - 1);
  141.  
  142.     return 0;
  143. }
Add Comment
Please, Sign In to add comment