Advertisement
Josif_tepe

Untitled

Oct 23rd, 2024
41
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.61 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. class Graph {
  5. public:
  6.     int n;
  7.    
  8.     vector<vector<int>> capacity, flow;
  9.     vector<int> height, excess;
  10.     vector<int> visited;
  11.     queue<int> excess_nodes;
  12.    
  13.     Graph(int n) {
  14.         this->n = n;
  15.         capacity = vector<vector<int>>(n, vector<int>(n, 0));
  16.     }
  17.    
  18.     void push(int A, int B) {
  19.         int f = min(excess[A], capacity[A][B] - flow[A][B]);
  20.         flow[A][B] += f;
  21.         flow[B][A] -= f;
  22.         excess[A] -= f;
  23.         excess[B] += f;
  24.        
  25.         if(f > 0 and excess[B] == f) {
  26.             excess_nodes.push(B);
  27.         }
  28.     }
  29.     void relabel(int node) {
  30.         int f = 2e9;
  31.         for(int i = 0; i < n; i++) {
  32.             if(capacity[node][i] - flow[node][i] > 0) {
  33.                 f = min(f, height[i]);
  34.             }
  35.         }
  36.         if(f < 2e9) {
  37.             height[node] = f + 1;
  38.         }
  39.     }
  40.     void drain(int node) {
  41.         while(excess[node] > 0) {
  42.             if(visited[node] < n) {
  43.                 int v = visited[node];
  44.                
  45.                 if(capacity[node][v]  - flow[node][v] > 0 and height[node] > height[v]) {
  46.                     push(node, v);
  47.                 }
  48.                 else {
  49.                     visited[node]++;
  50.                 }
  51.             }
  52.             else {
  53.                 relabel(node);
  54.                 visited[node] = 0;
  55.             }
  56.         }
  57.     }
  58.     int max_flow(int S, int T) {
  59.         height = vector<int>(n, 0);
  60.         height[S] = n;
  61.         flow = vector<vector<int>>(n, vector<int>(n, 0));
  62.         excess = vector<int>(n, 0);
  63.        
  64.         excess[S] = 2e9;
  65.         for(int i = 0; i < n; i++) {
  66.             if(i != S) {
  67.                 push(S, i);
  68.             }
  69.         }
  70.         visited = vector<int>(n, 0);
  71.        
  72.         while(!excess_nodes.empty()) {
  73.             int c = excess_nodes.front();
  74.             excess_nodes.pop();
  75.            
  76.             if(c != S and c != T) {
  77.                 drain(c);
  78.             }
  79.         }
  80.         int res = 0;
  81.         for(int i =0 ; i < n; i++) {
  82.             res += flow[i][T];
  83.         }
  84.         return res;
  85.    
  86.     }
  87.    
  88. };
  89.  
  90.  
  91. int main() {
  92.     Graph g(6);
  93.    
  94.     int graph[6][6]
  95.             = { { 0, 16, 13, 0, 0, 0 }, { 0, 0, 10, 12, 0, 0 },
  96.                 { 0, 4, 0, 0, 14, 0 },  { 0, 0, 9, 0, 0, 20 },
  97.                 { 0, 0, 0, 7, 0, 4 },   { 0, 0, 0, 0, 0, 0 } };
  98.      
  99.     for(int i = 0; i < 6; i++ ){
  100.         for(int j =0 ; j < 6; j++) {
  101.             g.capacity[i][j] = graph[i][j];
  102.         }
  103.     }
  104.     cout << g.max_flow(0, 5);
  105.    
  106.    
  107.  
  108.     return 0;
  109. }
  110.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement