首页 > 其他 > 详细

网络最大流

时间:2019-02-03 20:51:25      阅读:151      评论:0      收藏:0      [点我收藏+]

正在学习中。先放$Dinic$

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 #define re register
 6 #define rep(i, a, b) for (re int i = a; i <= b; ++i)
 7 #define repd(i, a, b) for (re int i = a; i >= b; --i)
 8 #define maxx(a, b) a = max(a, b);
 9 #define minn(a, b) a = min(a, b);
10 #define LL long long
11 #define INF (1 << 30)
12 
13 inline int read() {
14     int w = 0, f = 1; char c = getchar();
15     while (!isdigit(c)) f = c == - ? -1 : f, c = getchar();
16     while (isdigit(c)) w = (w << 3) + (w << 1) + (c ^ 0), c = getchar();
17     return w * f;
18 }
19 
20 const int maxn = 1e4 + 5, maxm = 1e5 + 5;
21 
22 struct Edge {
23     int u, v, c, f, pre;
24 };
25 
26 struct Graph {
27     queue<int> Q;
28     Edge ed[maxm << 1];
29     int n, m, G[maxn], s, t;
30     void init(int n) {
31         this->n = n;
32         memset(G, 0, sizeof(G));
33         m = 1;
34     }
35     void add(int u, int v, int c) {
36         ed[++m] = (Edge){u, v, c, 0, G[u]};
37         G[u] = m;
38         ed[++m] = (Edge){v, u, 0, 0, G[v]};
39         G[v] = m;
40     }
41     int vis[maxn], d[maxn];
42     bool bfs() {
43         memset(vis, 0, sizeof(vis));
44         vis[s] = 1;
45         Q.push(s);
46         d[s] = 1;
47         while (!Q.empty()) {
48             int u = Q.front(); Q.pop();
49             for (register int i = G[u]; i; i = ed[i].pre) {
50                 Edge &e = ed[i];
51                 if (!vis[e.v] && ed[i].f < ed[i].c) {
52                     vis[e.v] = 1;
53                     Q.push(e.v);
54                     d[e.v] = d[u] + 1;
55                 }
56             }
57         }
58         return vis[t];
59     }
60     int cur[maxn];
61     int dfs(int u, int a) {
62         if (u == t || a == 0) return a;
63         int flow = 0, f;
64         for (register int &i = cur[u]; i; i = ed[i].pre) {
65             Edge &e = ed[i];
66             if (d[u] + 1 == d[e.v] && (f = dfs(e.v, min(a, e.c-e.f)))) {
67                 e.f += f;
68                 ed[i^1].f -= f;
69                 flow += f;
70                 a -= f;
71                 if (a == 0) break;
72             }
73         }
74         return flow;
75     }
76     int maxflow(int s, int t) {
77         this->s = s, this->t = t;
78         int flow = 0;
79         while (bfs()) {
80             rep(i, 1, n) cur[i] = G[i];
81             flow += dfs(s, INF);
82         }
83         return flow;
84     }
85 } G;
86 
87 int n, m, s, t;
88 
89 int main() {
90     n = read(), m = read(), s = read(), t = read();
91     G.init(n);
92     rep(i, 1, m) {
93         int u = read(), v = read(), c = read();
94         G.add(u, v, c);
95     }
96     printf("%d", G.maxflow(s, t));
97     return 0;
98 }

 

网络最大流

原文:https://www.cnblogs.com/ac-evil/p/10350936.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!