【模板】【网络流】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

 

你可能感兴趣的:(dinic)