首页 > 其他 > 详细

网络流板子

时间:2020-02-29 19:53:30      阅读:67      评论:0      收藏:0      [点我收藏+]

最大流

技术分享图片
 1 struct Dinic
 2 {
 3     int head[maxn], tot, cur[maxn];
 4     int dis[maxn];
 5     int s, e;
 6     queue<int>q;
 7 
 8     struct node
 9     {
10         int v, w;
11         int next;
12     }p[maxn];
13 
14     void init()
15     {
16         tot = 0;
17         memset(head, -1, sizeof head);
18     }
19 
20     void add(int u, int v, int w)
21     {
22         p[tot].v = v;
23         p[tot].w = w;
24         p[tot].next = head[u];
25         head[u] = tot++;
26     }
27 
28     void addEdge(int u, int v, int w)
29     {
30         add(u, v, w);
31         add(v, u, 0);
32     }
33 
34     bool bfs()
35     {
36         memset(dis, 0, sizeof dis);
37         while (!q.empty())   q.pop();
38         dis[s] = 1;
39         q.push(s);
40         while (!q.empty())
41         {
42             int x = q.front();
43             q.pop();
44             for (int i = head[x]; i != -1; i = p[i].next)
45             {
46                 int v = p[i].v, w = p[i].w;
47                 if (!dis[v] && w)
48                 {
49                     dis[v] = dis[x] + 1;
50                     q.push(v);
51                 }
52             }
53         }
54         if (dis[e])  return true;
55         return false;
56     }
57 
58     int dfs(int x, int W)
59     {
60         if (x == e || W == 0)  return W;
61         int res = 0;
62         for (int i = cur[x]; i != -1; i = p[i].next)
63         {
64             cur[x] = p[i].next;
65             int v = p[i].v, w = p[i].w;
66             if (dis[v] == dis[x] + 1)
67             {
68                 int f = dfs(v, min(w, W));
69                 p[i].w -= f;
70                 p[i ^ 1].w += f;
71                 W -= f;
72                 res += f;
73                 if (W == 0)    break;
74             }
75         }
76         return res;
77     }
78 
79     int getMaxFlow()
80     {
81         int ans = 0;
82         while (bfs())
83         {
84             for (int i = s; i <= e; ++i) cur[i] = head[i];
85             ans += dfs(s, inf);
86         }
87         return ans;
88     }
89 };
Dinic

 

网络流板子

原文:https://www.cnblogs.com/zhang-Kelly/p/12384626.html

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