[网络流]

Posted kaike

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[网络流]相关的知识,希望对你有一定的参考价值。

先抄个模板

EK:

技术图片
 1 const int MAXN = 430;
 2 const int MAX_INT = (1 << 30);
 3  
 4 struct Edge
 5     int v, nxt, w;
 6 ;
 7  
 8 struct Node
 9     int v, id;
10 ;
11  
12 int n, m, ecnt;
13 bool vis[MAXN];
14 int head[MAXN];
15 Node pre[MAXN];
16 Edge edge[MAXN];
17  
18 void init()
19     ecnt = 0;
20     memset(edge, 0, sizeof(edge));
21     memset(head, -1, sizeof(head));
22 
23  
24 void addEdge(int u, int v, int w)
25     edge[ecnt].v = v;
26     edge[ecnt].w = w;
27     edge[ecnt].nxt = head[u];
28     head[u] = ecnt++;
29 
30  
31 bool bfs(int s, int t)
32     queue <int> que;
33     memset(vis, 0, sizeof(vis));
34     memset(pre, -1, sizeof(pre));
35     pre[s].v = s;
36     vis[s] = true;
37     que.push(s);
38     while(!que.empty())
39         int u = que.front();
40         que.pop();
41         for(int i = head[u]; i + 1; i = edge[i].nxt)
42             int v = edge[i].v;
43             if(!vis[v] && edge[i].w)
44                 pre[v].v = u;
45                 pre[v].id = i;
46                 vis[v] = true;
47                 if(v == t) return true;
48                 que.push(v);
49             
50         
51     
52     return false;
53 
54  
55 int EK(int s, int t)
56     int ans = 0;
57     while(bfs(s, t))
58         int mi = MAX_INT;
59         for(int i = t; i != s; i = pre[i].v)
60             mi = min(mi, edge[pre[i].id].w);
61         
62         for(int i = t; i != s; i = pre[i].v)
63             edge[pre[i].id].w -= mi;
64             edge[pre[i].id ^ 1].w += mi;
65         
66         ans += mi;
67     
68     return ans;
69 
70  
71 // 加边
72 addEdge(u, v, w);
73 addEdge(v, u, 0);
74 // 调用
75 int ans = EK(s, t);
View Code

 

以上是关于[网络流]的主要内容,如果未能解决你的问题,请参考以下文章

网络最大流学习随笔,详解网络流最大流

网络流之最大流

网络流

网络流(费用流):[网络流24题] 餐巾

网络流24题-题目总结

算法?日更?第三十三期网络流基础知识(最大流)