zipdang04

Dinic with Scaling

Jul 15th, 2021 (edited)
1,009
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.17 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4.  
  5. struct Flow{
  6.     struct Edge{int from, dest, oppo; ll capa;};
  7.    
  8.     const ll oo = 1ll << 60;
  9.     vector<Edge> edges, resi;
  10.     vector<vector<int>> graph;
  11.     int n, m, s, t;
  12.  
  13.     const int NaN = -1;
  14.     vector<int> level;
  15.     vector<int> ptr;
  16.  
  17.     bool bfs(ll lim){
  18.         level = vector<int>(n, NaN);
  19.  
  20.         queue<int> q;
  21.        
  22.         q.push(s); level[s] = 0;
  23.         while (!q.empty()){
  24.             int node = q.front(); q.pop();
  25.             int nodeLvl = level[node];
  26.  
  27.             for (int idx: graph[node]){
  28.                 Edge e = resi[idx];
  29.                 if (e.capa < lim || level[e.dest] != NaN) continue;
  30.                
  31.                 q.push(e.dest); level[e.dest] = nodeLvl + 1;
  32.             }
  33.         }
  34.  
  35.         return level[t] != NaN;
  36.     }
  37.    
  38.     bool dfs(int node, ll lim){
  39.         if (node == t) return true;
  40.         int currLevel = level[node];
  41.  
  42.         int &i = ptr[node], maxSize = graph[node].size();
  43.         for (; i < maxSize; i++){
  44.             int idx = graph[node][i];
  45.             Edge e = resi[idx];
  46.             if (e.capa < lim || level[e.dest] != currLevel + 1) continue;
  47.  
  48.             if (dfs(e.dest, lim)){
  49.                 resi[idx].capa -= lim;
  50.                 resi[e.oppo].capa += lim;
  51.                 return true;
  52.             }
  53.         }
  54.  
  55.         return false;
  56.     }
  57.  
  58.     Flow(){
  59.     }
  60.  
  61.     void init(int n, int s, int t){
  62.         this -> n = n; this -> s = s; this -> t = t;
  63.         m = 0; edges.clear();
  64.         graph = vector<vector<int>>(n);
  65.     }
  66.  
  67.     void addEdge(int from, int dest, ll capa){
  68.         edges.push_back({from, dest, m + 1, capa});
  69.         edges.push_back({dest, from, m    , 0});
  70.         graph[from].push_back(m),
  71.         graph[dest].push_back(m + 1);
  72.         m += 2;
  73.     }
  74.  
  75.     ll calculate(){
  76.         resi = edges; ll answer = 0;
  77.         ll tmp = oo;
  78.         while (tmp){
  79.             if (!bfs(tmp)){
  80.                 tmp >>= 1; continue;
  81.             }
  82.  
  83.             ptr = vector<int>(n, 0);
  84.             while (dfs(s, tmp))
  85.                 answer += tmp;
  86.         }
  87.         return answer;
  88.     }
  89. };
Add Comment
Please, Sign In to add comment