Advertisement
MystMe

Untitled

Apr 21st, 2017
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.20 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <fstream>
  4. using namespace std;
  5.  
  6. struct Element{
  7.     int num;
  8.     int dist;
  9.     int flow;
  10.     Element(int n, int d) : num(n), dist(d), flow(0) {}
  11. };
  12.  
  13. class CGraph{
  14. public:
  15.     CGraph(int n, int s, int t){
  16.         table.resize(n);
  17.         istok = s-1;
  18.         stok = t-1;
  19.  
  20.  
  21.         visited.resize(table.size(),false);
  22.     }
  23.     void AddEdge(int from, int to, int dist){
  24.         table[from-1].push_back(Element(to-1,dist));
  25.     }
  26.  
  27.     int solve(){
  28.         int max = 0;
  29.         int sent = dfs(istok,200000);
  30.         while (sent > 0){
  31.             max +=sent;
  32.             for(int i = 0; i < table.size(); i++){
  33.                 visited[i] = 0;
  34.             }
  35.             sent = dfs(istok,200000);
  36.         }
  37.         return  max;
  38.     }
  39.  
  40.  
  41.  
  42. private:
  43.     vector<vector<Element>>table;
  44.  
  45.     int istok;
  46.     int stok;
  47.  
  48.     vector<bool> visited;
  49.  
  50.     int dfs(int u, int Cmin){
  51.         if(u == stok){
  52.             return Cmin;
  53.         }
  54.         visited[u] = true;
  55.  
  56.         for(int i = 0; i < table[u].size();i++){
  57.             Element v = table[u][i];
  58.             if(!visited[v.num] && v.flow < v.dist){
  59.                 int delta = dfs(v.num, min(Cmin,v.dist - v.flow));
  60.                 if (delta > 0){
  61.                     table[u][i].flow += delta;
  62.                     for(int k = 0; k < table[v.num].size(); k++){
  63.                         if(table[v.num][k].num == u){
  64.                             table[v.num][k].flow -= delta;
  65.                             return delta;
  66.                         }
  67.                     }
  68.                     table[v.num].push_back(Element(u, 0));
  69.                     table[v.num][table[v.num].size()-1].flow -= delta;
  70.                     return delta;
  71.                 }
  72.             }
  73.         }
  74.         return 0;
  75.     }
  76. };
  77.  
  78. int main(){
  79.     ifstream fin("maxflow.in");
  80.     ofstream fout("maxflow.out");
  81.     int n = 0;
  82.     int m = 0;
  83.     fin >> n >> m;
  84.     CGraph g(n, 1, n);
  85.     for(int i = 0; i < m; i++){
  86.         int from = 0; int to = 0; int dist = 0;
  87.         fin >> from >> to >> dist;
  88.         g.AddEdge(from,to,dist);
  89.     }
  90.     fout << g.solve();
  91.     fin.close();
  92.     fout.close();
  93.     return 0;
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement