Advertisement
Guest User

Untitled

a guest
Apr 21st, 2019
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.91 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <cmath>
  4. #include <fstream>
  5. #include <string>
  6.  
  7. struct Edge {
  8.     int a, b, capacity, flow;
  9. };
  10.  
  11. class MaxFlow
  12. {
  13. private:
  14.     const int INF = 1000000000;
  15.     int vertexCount;
  16.     std::vector<Edge> edges;
  17.     std::vector<std::vector<int>> g;
  18.     int * q;
  19.     int * d;
  20.     int * ptr;
  21.     int s;
  22.     int t;
  23. public:
  24.     MaxFlow(std::string fileName)
  25.     {
  26.         int m, a, b, c;
  27.         std::ifstream in(fileName, std::ios::in);
  28.         in >> vertexCount;
  29.         in >> m;
  30.         g.assign(vertexCount, std::vector<int>());
  31.         q = new int[vertexCount];
  32.         d = new int[vertexCount];
  33.         ptr = new int[vertexCount];
  34.         for (size_t i = 0; i < vertexCount; i++)
  35.         {
  36.             in >> a >> b >> c;
  37.             addEdge(a - 1, b - 1, c);
  38.         }
  39.         in.close();
  40.     }
  41.      
  42.     void addEdge(int a, int b, int capacity)
  43.     {
  44.         Edge e1 = { a, b, capacity, 0 };
  45.         Edge e2 = { b, a, 0, 0 };
  46.         g[a].push_back(edges.size());
  47.         edges.push_back(e1);
  48.         g[b].push_back(edges.size());
  49.         edges.push_back(e2);
  50.     }
  51.  
  52.     bool BFS()
  53.     {
  54.         int qh = 0;
  55.         int qt = 0;
  56.         q[qt++] = s;
  57.         memset(d, -1, vertexCount * sizeof(d[0]));
  58.         d[s] = 0;
  59.         while (qh < qt && d[t] == -1) {
  60.             int v = q[qh++];
  61.             for (size_t i = 0; i<g[v].size(); ++i) {
  62.                 int id = g[v][i],
  63.                     to = edges[id].b;
  64.                 if (d[to] == -1 && edges[id].flow < edges[id].capacity) {
  65.                     q[qt++] = to;
  66.                     d[to] = d[v] + 1;
  67.                 }
  68.             }
  69.         }
  70.         return d[t] != -1;
  71.     }
  72.     int min(int a, int b)
  73.     {
  74.         return (a < b ? a : b);
  75.     }
  76.     int dfs(int v, int flow) {
  77.         if (!flow)  return 0;
  78.         if (v == t)  return flow;
  79.         for (; ptr[v]<(int)g[v].size(); ++ptr[v]) {
  80.             int id = g[v][ptr[v]],
  81.                 to = edges[id].b;
  82.             if (d[to] != d[v] + 1)  continue;
  83.             int pushed = dfs(to, min(flow, edges[id].capacity - edges[id].flow));
  84.             if (pushed) {
  85.                 edges[id].flow += pushed;
  86.                 edges[id ^ 1].flow -= pushed;
  87.                 return pushed;
  88.             }
  89.         }
  90.         return 0;
  91.     }
  92.  
  93.     int Dinic(int s, int t)
  94.     {
  95.         this->s = s;
  96.         this->t = t;
  97.         int flow = 0;
  98.         for (;;) {
  99.             if (!BFS())  break;
  100.             memset(ptr, 0, vertexCount * sizeof ptr[0]);
  101.             while (int pushed = dfs(s, INF))
  102.                 flow += pushed;
  103.         }
  104.         return flow;
  105.     }
  106.     int vertexSize()
  107.     {
  108.         return this->vertexCount;
  109.     }
  110.  
  111. };
  112.  
  113. void main()
  114. {
  115.     MaxFlow* mf = new MaxFlow("maxflow.in");
  116.     std::ofstream out("maxflow.out", std::ios::out);
  117.     out << mf->Dinic(0, mf->vertexSize() - 1) + 1;
  118.     out.close();
  119. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement