wind的网络流神模板--【秒过。。】【网络流】

本文介绍了一种高效的网络流算法实现,通过对比多种模板,最终选择了Wind的网络流算法。该算法使用Dinic方法,并提供了详细的代码实现,包括初始化、边的添加、宽度优先搜索及深度优先搜索等关键步骤。
在被刘汝佳接连坑了两次之后决定不再用刘汝佳的网络流了   
之后又找了一些模板   发现wind 的最给力了
 1 const int maxn = 405;
 2 const int maxm = maxn * maxn;
 3 const int inf = 1000000000;
 4 
 5 class Dinic {
 6 public :
 7     struct Node {
 8         int u, v, f, next;
 9     }e[maxm];
10 
11     int head[maxn], p, lev[maxn], cur[maxn];
12     int que[maxm];
13 
14     void init() {
15         p = 0; 
16         memset(head, -1, sizeof(head));
17     }
18 
19     void add(int u, int v, int f) {
20         e[p].u = u; e[p].v = v; e[p].f = f; e[p].next = head[u]; head[u] = p++;
21         e[p].u = v; e[p].v = u; e[p].f = 0; e[p].next = head[v]; head[v] = p++;
22     }
23 
24     bool bfs(int s, int t) {
25         int u, v, qin = 0, qout = 0;
26         memset(lev, 0, sizeof(lev)); lev[s] = 1; que[qin++] = s;
27         while(qout != qin) {
28             u = que[qout++];
29             for(int i = head[u]; i != -1; i = e[i].next) {
30                 if(e[i].f > 0 && !lev[v = e[i].v]) {
31                     lev[v] = lev[u] + 1, que[qin++] = v;
32                     if(v == t) return 1;
33                 }
34             }
35         }
36         return 0;
37     }
38 
39     int dfs(int s, int t) {
40         int i, f, qin, u, k;
41         int flow = 0;
42         while(bfs(s, t)) {
43             memcpy(cur, head, sizeof(head));
44             u = s, qin = 0;
45             while(1) {
46                 if(u == t) {
47                     for(k = 0, f = inf; k < qin; k++)
48                         if(e[que[k]].f < f) f = e[que[i=k]].f;
49                     for(k = 0; k < qin; k++)
50                         e[que[k]].f -= f, e[que[k]^1].f += f;
51                     flow += f, u = e[que[qin = i]].u;
52                 }
53                 for(i = cur[u]; cur[u] != -1; i = cur[u] = e[cur[u]].next)
54                     if(e[i].f > 0 && lev[u] + 1 == lev[e[i].v]) break;
55                 if(cur[u] != -1)
56                     que[qin++] = cur[u], u = e[cur[u]].v;
57                 else {
58                     if(qin == 0) break;
59                     lev[u] = -1, u = e[que[--qin]].u;
60                 }
61             }
62         }
63         return flow;
64     }
65 };
66 
67 Dinic g;
View Code

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值