The5threic1-1

Dinitz

Apr 24th, 2024
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.47 KB | Source Code | 0 0
  1. const long long infi = 1e18;
  2. class dinitz
  3. {
  4.     public:
  5.  
  6.         struct edge
  7.         {
  8.             int to, rev;
  9.             long long cap, ocap;
  10.             long long flow()
  11.             {
  12.                 return max(ocap-cap, 0ll);
  13.             }
  14.         };
  15.         vector<vector<edge>> edg;
  16.         vector<int> level, q, ptr;
  17.         dinitz(int n)
  18.         {
  19.             level = q = ptr = vector<int>(n); edg = vector<vector<edge>>(n);
  20.         }
  21.         void add_edge(int a, int b, long long c, long long r_cap = 0)
  22.         {
  23.             edg[a].push_back({b, (int)edg[b].size(), c, c});
  24.             edg[b].push_back({a, (int)edg[a].size()-1, r_cap, r_cap});     
  25.         }
  26.         long long dfs(int v, int t, long long f)
  27.         {
  28.             if(v==t || !f)
  29.             {
  30.                 return f;
  31.             }
  32.             for(int& i=ptr[v]; i<(int)edg[v].size(); i++)
  33.             {
  34.                 edge& e = edg[v][i];
  35.                 if(level[e.to]==level[v]+1)
  36.                 {
  37.                     if(long long p = dfs(e.to, t, min(f, e.cap)))
  38.                     {
  39.                         e.cap -= p; edg[e.to][e.rev].cap += p;
  40.                         return p;
  41.                     }      
  42.                 }
  43.             }  
  44.             return 0;
  45.         }
  46.         long long calci(int s, int t)
  47.         {
  48.             long long flow = 0;
  49.             q[0] = s;
  50.             for(int i=0; i<31; i++)
  51.             {
  52.                 do
  53.                 {
  54.                     level = ptr = vector<int>(q.size());
  55.                     int qi = 0, qe = level[s] = 1;
  56.                     while(qi<qe && !level[t])
  57.                     {
  58.                         int v = q[qi++];
  59.                         for(edge e : edg[v])   
  60.                         {
  61.                             if(!level[e.to] && e.cap>>(30-i))
  62.                             {
  63.                                 q[qe++] = e.to; level[e.to] = level[v] + 1;
  64.                             }
  65.                         }  
  66.                     }
  67.                     while(long long p = dfs(s, t, infi))
  68.                     {
  69.                         flow += p;
  70.                     }
  71.                 }
  72.                 while(level[t]);
  73.             }
  74.             return flow;
  75.         }          
  76. };
  77.  
Tags: Maximum Flow
Advertisement
Add Comment
Please, Sign In to add comment