Advertisement
Josif_tepe

Untitled

Sep 26th, 2024
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.68 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4. using namespace std;
  5. const int INF = 2e9;
  6. struct Edge {
  7.     int v;
  8.     int flow, capacity;
  9.     int rev;
  10.    
  11.     Edge(int v, int flow, int capacity, int rev) {
  12.         this->v = v;
  13.         this->flow = flow;
  14.         this->capacity = capacity;
  15.         this->rev = rev;
  16.     }
  17. };
  18. class Graph {
  19. private:
  20.     int n;
  21.     vector<int> level;
  22.     vector<vector<Edge>> adj;
  23. public:
  24.     Graph(int n) {
  25.         this->n = n;
  26.         level.resize(n);
  27.         adj.resize(n + 1);
  28.     }
  29.     void add_edge(int a, int b, int cap) {
  30.         Edge forward(b, 0, cap, (int) adj[b].size());
  31.         Edge backwards  (a, 0, 0, (int) adj[a].size());
  32.         adj[a].push_back(forward);
  33.         adj[b].push_back(backwards);
  34.     }
  35.    
  36.     bool bfs(int S, int T) {
  37.         for(int i = 0; i < n; i++) {
  38.             level[i] = -1;
  39.         }
  40.         level[S] = 0;
  41.         queue<int> q;
  42.         q.push(S);
  43.        
  44.         while(!q.empty()) {
  45.             int node = q.front();
  46.             q.pop();
  47.             for(Edge e : adj[node]) {
  48.                 if(level[e.v] == -1 and e.flow < e.capacity) {
  49.                     level[e.v] = level[node] + 1;
  50.                     q.push(e.v);
  51.                 }
  52.             }
  53.         }
  54.         return level[T] != -1;
  55.     }
  56.     int send_flow(int node, int flow, int T, vector<int> & v) {
  57.         if(node == T) {
  58.             return flow;
  59.         }
  60.         for(; v[node] < adj[node].size(); v[node]++) {
  61.             Edge & e = adj[node][v[node]];
  62.             if(level[e.v] == level[node] + 1 and e.flow < e.capacity) {
  63.                 int min_flow = min(flow, e.capacity - e.flow);
  64.                 int res_flow = send_flow(e.v, min_flow, T, v);
  65.                
  66.                 if(res_flow > 0) {
  67.                     e.flow += res_flow;
  68.                     adj[e.v][e.rev].flow -= res_flow;
  69.                     return res_flow;
  70.                 }
  71.             }
  72.         }
  73.         return 0;
  74.     }
  75.     int dinics_algorithm(int S, int T) {
  76.         if(S == T) {
  77.             return -1;
  78.         }
  79.         int res = 0;
  80.        
  81.         while(bfs(S, T)) {
  82.             vector<int> v(n + 1, 0);
  83.        
  84.             while(int fl = send_flow(S, INF, T, v) > 0) {
  85.                 res += fl;
  86.             }
  87.         }
  88.         return res;
  89.     }
  90. };
  91.  
  92. int main() {
  93.     Graph g(6);
  94.     g.add_edge(0, 1, 16);
  95.     g.add_edge(0, 2, 13);
  96.     g.add_edge(1, 2, 10);
  97.     g.add_edge(1, 3, 12);
  98.     g.add_edge(2, 1, 4);
  99.     g.add_edge(2, 4, 14);
  100.     g.add_edge(3, 2, 9);
  101.     g.add_edge(3, 5, 20);
  102.     g.add_edge(4, 3, 7);
  103.     g.add_edge(4, 5, 4);
  104.    
  105.     cout << g.dinics_algorithm(0, 5) << endl;
  106.     return 0;
  107. }
  108.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement