Advertisement
Corezzi

UVA 820

Feb 20th, 2019
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.61 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. class Dinic{
  6.     struct Edge{
  7.         int to;
  8.         int c;
  9.         int flow;
  10.     };
  11.    
  12. public:
  13.     vector<Edge> edges;
  14.     vector<vector<int>> g;
  15.     vector<int> lvl;
  16.     int s,t;
  17.     const int INF = 100000;
  18.     const int VCOUNT;
  19.    
  20.     Dinic(int VCOUNT) : VCOUNT(VCOUNT), g(VCOUNT), lvl(VCOUNT){}
  21.  
  22.     int addEdge(int u, int v, int cap){
  23.         Edge dir = {v,cap,0};
  24.         Edge aug = {u,cap,0};
  25.         int ret = edges.size();
  26.         g[u].push_back(edges.size());
  27.         edges.push_back(dir);
  28.         g[v].push_back(edges.size());
  29.         edges.push_back(aug);
  30.         return ret;
  31.     }
  32.    
  33.     void clearAll(){
  34.         for(auto &a : g)a.clear();
  35.         edges.clear();
  36.     }
  37.    
  38.     void clearFlow(){
  39.         for(auto &e : edges)e.flow = 0;
  40.     }
  41.    
  42.     bool BFS(){
  43.         fill(lvl.begin(), lvl.end(), -1);
  44.         queue<int> q;
  45.         q.push(s);
  46.         lvl[s] = 0;
  47.        
  48.         while(!q.empty()){
  49.             int v = q.front(); q.pop();
  50.             if(v == t) break;
  51.            
  52.             for(auto u : g[v]){
  53.                 Edge &e = edges[u];
  54.                 if(lvl[e.to] < 0 && e.flow < e.c){
  55.                     lvl[e.to] = lvl[v] + 1;
  56.                     q.push(e.to);
  57.                 }
  58.             }
  59.         }
  60.        
  61.         return lvl[t] != -1;
  62.     }
  63.    
  64.     int DFS(int v, int minFlow){
  65.         if(v == t || minFlow == 0) return minFlow;
  66.         int flow = 0;
  67.        
  68.         for(auto adj : g[v]){
  69.             Edge &e = edges[adj];
  70.             if(lvl[e.to] == lvl[v]+1 && e.flow < e.c){
  71.                 int ret = DFS(e.to, min(minFlow, e.c - e.flow));
  72.                 if(ret > 0){
  73.                     e.flow += ret;
  74.                     edges[adj^1].flow -= ret;
  75.                     flow += ret;
  76.                     minFlow -= ret;
  77.                     if(minFlow <= 0)break;
  78.                 }
  79.             }
  80.         }
  81.        
  82.         return flow;
  83.     }
  84.    
  85.     int maxFlow(int s, int t){
  86.         this->s = s;
  87.         this->t = t;
  88.        
  89.         int mf = 0;
  90.         while(BFS()){
  91.             int f = DFS(s, INF);
  92.             mf += f;
  93.             if(f == 0) break;
  94.         }
  95.        
  96.         return mf;
  97.     }
  98. };
  99.  
  100. int main(){
  101.     //ios_base::sync_with_stdio(false);cin.tie(NULL);
  102.    
  103.     int v;
  104.     int it = 1;
  105.     while(cin >> v, v){
  106.         int s,t,c;
  107.         cin >> s >> t >> c;
  108.         Dinic d(v+1);
  109.        
  110.         while(c-->0){
  111.             int x,y,cap;
  112.             cin >> x >> y >> cap;
  113.             d.addEdge(x,y,cap);
  114.         }
  115.        
  116.         printf("Network %d\n", it++);
  117.         printf("The bandwidth is %d.\n\n", d.maxFlow(s,t));
  118.     }
  119.    
  120.     return 0;  
  121. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement