qwerty787788

Flow

Jul 5th, 2014
517
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 1.61 KB | None | 0 0
  1.     class Edge {
  2.         int fr, to;
  3.         long flow, cap;
  4.         Edge rev;
  5.  
  6.         Edge(int fr, int to, long cap) {
  7.             this.fr = fr;
  8.             this.to = to;
  9.             this.cap = cap;
  10.         }
  11.     }
  12.  
  13.     class Flow {
  14.         int n;
  15.         ArrayList<Edge>[] g;
  16.  
  17.         Flow(int n) {
  18.             this.n = n;
  19.             g = new ArrayList[n];
  20.             for (int i = 0; i < n; i++) {
  21.                 g[i] = new ArrayList<>();
  22.             }
  23.             q = new int[n];
  24.             h = new int[n];
  25.             cur = new int[n];
  26.         }
  27.  
  28.         void addEdge(int fr, int to, long cap) {
  29.             Edge e1 = new Edge(fr, to, cap);
  30.             Edge e2 = new Edge(to, fr, 0);
  31.             e1.rev = e2;
  32.             e2.rev = e1;
  33.             g[fr].add(e1);
  34.             g[to].add(e2);
  35.         }
  36.  
  37.         int[] h;
  38.         int[] cur;
  39.         int[] q;
  40.  
  41.         boolean bfs() {
  42.             int qIt = 0, qSz = 0;
  43.             q[qSz++] = 0;
  44.             Arrays.fill(h, -1);
  45.             h[0] = 0;
  46.             while (qIt < qSz) {
  47.                 int v = q[qIt++];
  48.                 for (Edge e : g[v]) {
  49.                     if (e.flow == e.cap)
  50.                         continue;
  51.                     if (h[e.to] == -1) {
  52.                         h[e.to] = h[e.fr] + 1;
  53.                         q[qSz++] = e.to;
  54.                     }
  55.                 }
  56.             }
  57.             return h[n - 1] != -1;
  58.         }
  59.  
  60.         long dfs(int v, long flow) {
  61.             if (v == n - 1 || flow == 0)
  62.                 return flow;
  63.             for (; cur[v] < g[v].size(); cur[v]++) {
  64.                 Edge e = g[v].get(cur[v]);
  65.                 if (h[e.to] != h[e.fr] + 1 || e.flow == e.cap)
  66.                     continue;
  67.                 long add = dfs(e.to, Math.min(flow, e.cap - e.flow));
  68.                 if (add == 0)
  69.                     continue;
  70.                 e.flow += add;
  71.                 e.rev.flow -= add;
  72.                 return add;
  73.             }
  74.             return 0;
  75.         }
  76.  
  77.         long flow() {
  78.             long res = 0;
  79.             while (bfs()) {
  80.                 Arrays.fill(cur, 0);
  81.                 while (true) {
  82.                     long add = dfs(0, Long.MAX_VALUE);
  83.                     if (add == 0)
  84.                         break;
  85.                     res += add;
  86.                 }
  87.             }
  88.             return res;
  89.         }
  90.     }
Advertisement
Add Comment
Please, Sign In to add comment