Advertisement
Ahmed_Negm

Untitled

Nov 4th, 2024
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.99 KB | None | 0 0
  1. struct Dinic{
  2.     struct Edge{
  3.         int u, v;
  4.         ll cap, flow = 0;
  5.         Edge(int u, int v, ll cap) : u(u), v(v), cap(cap) {}
  6.     };
  7.  
  8.     const ll flow_inf = 1e18;
  9.     vector<Edge> edges;
  10.     vector<vector<int>> adj;
  11.     int n, m = 0;
  12.     int s, t;
  13.     vector<int> level, ptr;
  14.     queue<int> q;
  15.  
  16.     Dinic(int n, int s, int t) : n(n), s(s), t(t){
  17.         adj = vector<vector<int>>(n);
  18.         level = vector<int>(n);
  19.         ptr = vector<int>(n);
  20.     }
  21.  
  22.     void add_edge(int u, int v, ll cap){
  23.         edges.emplace_back(u, v, cap);
  24.         edges.emplace_back(v, u, 0);
  25.         adj[u].push_back(m);
  26.         adj[v].push_back(m+1);
  27.         m += 2;
  28.     }
  29.  
  30.     bool bfs(){
  31.         while(!q.empty()){
  32.             int v = q.front();
  33.             q.pop();
  34.             for(int id : adj[v]){
  35.                 if(edges[id].cap == edges[id].flow) continue;
  36.                 if(level[edges[id].v] != -1) continue;
  37.                 level[edges[id].v] = level[v] + 1;
  38.                 q.push(edges[id].v);
  39.             }
  40.         }
  41.         return level[t] != -1;
  42.     }
  43.  
  44.     ll dfs(int v, ll pushed){
  45.         if(!pushed) return 0;
  46.         if(v == t) return pushed;
  47.  
  48.         for(int& cid = ptr[v]; cid < (int)adj[v].size(); cid++){
  49.             int id = adj[v][cid];
  50.             int u = edges[id].v;
  51.             if(level[v] + 1 != level[u] || edges[id].cap == edges[id].flow) continue;
  52.             ll tr = dfs(u, min(pushed, edges[id].cap - edges[id].flow));
  53.             if(tr == 0) continue;
  54.             edges[id].flow += tr;
  55.             edges[id^1].flow -= tr;
  56.             return tr;
  57.         }
  58.         return 0;
  59.     }
  60.  
  61.  
  62.     ll flow(){
  63.         ll f = 0;
  64.         while(true){
  65.             fill(level.begin(), level.end(), -1);
  66.             level[s] = 0;
  67.             q.push(s);
  68.             if(!bfs()) break;
  69.             fill(ptr.begin(), ptr.end(), 0);
  70.             while(ll pushed = dfs(s, flow_inf)){
  71.                 f += pushed;
  72.             }
  73.         }
  74.         return f;
  75.     }
  76.  
  77. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement