【模板】【网络流】Dinic

时间:2021-04-11 04:30:30
【模板】【网络流】Dinic【模板】【网络流】Dinic
  1 /*
  2 唐代杜荀鹤
  3 《小松》
  4 自小刺头深草里,而今渐觉出蓬蒿。
  5 时人不识凌云木,直待凌云始道高。
  6 */
  7 #include <iostream>
  8 #include <cstdio>
  9 #include <algorithm>
 10 #include <cstring>
 11 #include <vector>
 12 #include <utility>
 13 #include <iomanip>
 14 #include <string>
 15 #include <cmath>
 16 #include <queue>
 17 #include <assert.h>
 18 #include <map>
 19 #include <ctime>
 20 #include <cstdlib>
 21 #include <stack>
 22 #include <set> 
 23 #define LOCAL
 24 const int INF = 0x7fffffff;
 25 const int MAXN = 100000  + 10;
 26 const int maxnode = 20000 * 2 + 200000 * 20;
 27 const int MAXM = 50000 + 10;
 28 const int MAX = 100;
 29 using namespace std;
 30 struct Edge{
 31        int u, v, c, f;
 32        void init(int a, int b, int d, int e){
 33             u = a;v = b;
 34             c = d;f = e;
 35        }
 36 }edges[MAXM];
 37 int next[MAXN], M, cur[MAXN], vis[MAXN];
 38 int dist[MAXN], head[MAXN], n, m, sta, end;
 39 
 40 void addEdge(int u, int v, int c){
 41      edges[M].init(u, v, c, 0);M++;
 42      edges[M].init(v, u, 0, 0);//反向边 
 43      next[M - 1] = head[u];
 44      head[u] = M - 1;
 45      next[M] = head[v];
 46      head[v] = M++;
 47      return;
 48 }
 49 void init(){
 50      M = 0;//总边数 
 51      memset(head, -1, sizeof(head));
 52      scanf("%d%d", &n, &m);
 53      for (int i = 1; i <= m; i++){
 54          int u, v, c;
 55          scanf("%d%d%d", &u, &v, &c);
 56          addEdge(u, v, c);
 57      }
 58      sta = 1; 
 59      end = n;
 60 }
 61 bool bfs(){
 62      memset(vis, 0, sizeof(vis));
 63      queue<int>Q;
 64      dist[sta] = 0;
 65      vis[sta] = 1;
 66      Q.push(sta);
 67      while (!Q.empty()){
 68            int u = Q.front();
 69            Q.pop();
 70            for (int i = head[u]; i != -1;  i = next[i]){
 71                int e = i, v = edges[e].v;
 72                if (vis[v]) continue;
 73                if (edges[e].c > edges[e].f){
 74                   vis[v] = 1;
 75                   dist[v] = dist[u] + 1;
 76                   Q.push(v);
 77                }
 78            }
 79      }
 80      return vis[end];
 81 }
 82 int dfs(int x, int a){
 83     if (x == end || a == 0) return a;
 84     int flow = 0, f;
 85     if (cur[x] == -1) cur[x] = head[x];
 86     for (int &i = cur[x]; i != -1; i = next[i]){
 87         int e = i, v = edges[i].v;
 88         if (dist[v] == dist[x] + 1 && (f = dfs(v, min(edges[e].c - edges[e].f, a))) > 0){
 89            flow += f;
 90            a -= f;
 91            edges[e].f += f;
 92            edges[e ^ 1].f -= f;
 93            if (a == 0) break;
 94         }
 95     }
 96     return flow;
 97 }
 98 int Dinic(){
 99     int flow = 0;
100     while (bfs()){
101           memset(cur, -1, sizeof(cur));
102           flow += dfs(sta, INF);
103     }
104     return flow;
105 }
106 
107 int main(){
108    #ifdef LOCAL
109    freopen("data.txt", "r", stdin);
110    freopen("out.txt", "w", stdout);
111    #endif
112    init();
113    printf("%d", Dinic());
114    //printf("%d", (a == c));
115    return 0; 
116 }
View Code