joylintp

Dinic

Nov 5th, 2021 (edited)
282
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.02 KB | None | 0 0
  1. static const int INF = 0x3f3f3f3f;
  2.  
  3. struct Dinic
  4. {
  5.     static const int N = 16002;
  6.     struct Edge
  7.     {
  8.         int to, cap, rev;
  9.         Edge() {}
  10.         Edge(int _to, int _cap, int _rev) : to(_to), cap(_cap), rev(_rev) {}
  11.     };
  12.     vector<Edge> G[N];
  13.     void add_edge(int from, int to, int cap)
  14.     {
  15.         G[from].push_back(Edge(to, cap, (int)G[to].size()));
  16.         G[to].push_back(Edge(from, 0, (int)G[from].size() - 1));
  17.     }
  18.     int n, s, t;
  19.     void init(int _n, int _s, int _t)
  20.     {
  21.         n = _n, s = _s, t = _t;
  22.         for (int i = 0; i < n; i++)
  23.             G[i].clear();
  24.     }
  25.     int level[N], iter[N];
  26.     void bfs(void)
  27.     {
  28.         for (int i = 0; i < N; i++)
  29.             level[i] = -1;
  30.         level[s] = 0;
  31.         queue<int> que;
  32.         que.push(s);
  33.         while (!que.empty())
  34.         {
  35.             int tmp = que.front();
  36.             que.pop();
  37.             for (Edge e : G[tmp])
  38.                 if (e.cap > 0 && level[e.to] == -1)
  39.                     level[e.to] = level[tmp] + 1, que.push(e.to);
  40.         }
  41.     }
  42.     int dfs(int now, int flow)
  43.     {
  44.         if (now == t)
  45.             return flow;
  46.         for (int &i = iter[now]; i < (int)G[now].size(); i++)
  47.         {
  48.             Edge &e = G[now][i];
  49.             if (e.cap > 0 && level[e.to] == level[now] + 1)
  50.             {
  51.                 int ret = dfs(e.to, min(flow, e.cap));
  52.                 if (ret > 0)
  53.                 {
  54.                     e.cap = max(-INF, e.cap - ret), G[e.to][e.rev].cap = min(INF, G[e.to][e.rev].cap + ret);
  55.                     return ret;
  56.                 }
  57.             }
  58.         }
  59.         return 0;
  60.     }
  61.     int flow(void)
  62.     {
  63.         int ret = 0;
  64.         while (true)
  65.         {
  66.             bfs();
  67.             if (level[t] == -1)
  68.                 break;
  69.             for (int i = 0; i < N; i++)
  70.                 iter[i] = 0;
  71.             int tmp;
  72.             while ((tmp = dfs(s, INF)) > 0)
  73.                 ret = min(INF, ret + tmp);
  74.         }
  75.         return ret;
  76.     }
  77. } flow;
Add Comment
Please, Sign In to add comment