最大流EK算法模板

  最近学了下最大流算法,大概思想算是懵懵懂懂了,现在想把模板记录下来,以备后面深刻学习之用。

  

 1 #include<cstdio>
 2 #include<cstring>
 3 using namespace std;
 4
 5 #define _clr(x, y) memset(x, y, sizeof (x))
 6 #define Min(x, y) (x < y ? x : y)
 7 #define INF 0x3f3f3f3f
 8 #define N 210
 9
10 int map[N][N];
11 int pre[N], Sta[N];
12 bool used[N];
13 int n, m;
14
15 //bfs判断s--t之间是否还存在增广路
16 bool bfs(int s, int t)
17 {
18     _clr(used, 0);
19     _clr(pre, -1);
20     int top=1;
21     Sta[top++] = s;
22     used[s] = true;
23     while(top)
24     {
25         int v = Sta[--top];
26         for(int i=1; i<=n; i++)
27         {
28             if(map[v][i] && !used[i])
29             {
30                 used[i] = true;
31                 pre[i] = v;
32                 if(i==t)
33                     return true;
34                 Sta[top++] = i;
35             }
36         }
37     }
38     return false;
39 }
40
41 int EK(int s, int t)
42 {
43     //初始化最大流为0
44     int maxFlow=0, d;
45
46     //若s--t之间存在增广路
47     while(bfs(s, t))
48     {
49         d = INF;
50         //找到最小的可增量
51         for(int i=t; i!=s; i=pre[i])
52             d = Min(d, map[pre[i]][i]);
53
54         //添加反向边,更新残留网络
55         for(int i=t; i!=s; i=pre[i])
56         {
57             map[pre[i]][i] -= d;
58             map[i][pre[i]] += d;
59         }
60         maxFlow += d;
61     }
62     return maxFlow;
63 }
64
65
66 int main()
67 {
68     int x, y, z;
69     while(~scanf("%d%d", &m, &n))
70     {
71         _clr(map, 0);
72         for(int i=0; i<m; i++)
73         {
74             scanf("%d%d%d",&x, &y, &z);
75             map[x][y] += z;
76         }
77         printf("%d\n",EK(1, n));
78     }
79     return 0;
80 }
时间: 2024-11-05 12:24:29

最大流EK算法模板的相关文章

POJ1273 最大流 EK算法

套了个EK的模板 //#pragma comment(linker, "/STACK:16777216") //for c++ Compiler #include <stdio.h> #include <iostream> #include <climits> #include <cstring> #include <cmath> #include <stack> #include <queue> #i

POJ 1273 Drainage Ditches(我的EK算法模板)

题意:给你n条边,目标位置t:接下来是每条边,包括起点,终点,容量: 感想:第一道最大流的代码,这道题是我更深地理解了Ek算法,不过这道题有个超坑的情况,那就是出现重边的情况==! 思路:EK算法 AC代码: #include<stdio.h> #include<string.h> #include<algorithm> #include<queue> using namespace std; #define INF 100000000 #define N

HDU 3549 Flow Problem ( 最大流 -EK 算法)

C++,G++的读取速度差距也太大了 Flow Problem 题意:n,m表示n个点m条有向带权边 问:从1-n最大流多少 裸最大流,拿来练手,挺不错的 #include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> #include <queue> #include <algorithm> const int N = 210; #define

最大流ISAP算法模板

这两天学习了最大流,下面是ISAP算法模板: const int inf = 0x3fffffff; template <int N, int M> struct Isap { int top; int d[N], pre[N], cur[N], gap[N]; struct Vertex{ int head; } V[N]; struct Edge{ int v, next; int c, f; } E[M]; void init(){ memset(V, -1, sizeof(V)); t

最大流的EK算法模板

模板题:洛谷p3376 题目大意: 给出一个网络图,以及其源点和汇点,求出其网络最大流. 基本思路: 套模板 EK的时间复杂度O(V*E^2) EK算法思路: 1.通过BFS拓展合法节点(每个节点在本次BFS中仅遍历一次),找到汇点,并记录每个节点的前面节点(pre)(若找不到增广路,算法结束) 2.通过BFS的记录,从汇点回溯回源点,记录下每条弧流量的**最小值**minn, ans += minn(否则就会超出某条边的限制流量) 3.将所有经过的边的流量减去minn,反向边加上minn 4.

图论 最大流EK算法

今天接触了最大流,网上有很多ppt,耐心看下,再敲几遍代码大概就能懂意思了 EK 算法 关键是要理解要理解反悔的这个意思,因为每次当你选择了一种方式,但是这种方式不一定是最优的所以我们要再来建立一条反向边, 来完成反悔的策略 然后就是大概一直找增广路,改变最大的值,一直到找不到增广路为止 现在把模板的代码附上,并且给予注释 下面有两种方式一种是紫书上刘汝佳的代码,还有种是用链式前向星,还有种是dfs的方式,之后会继续补充 分别给出两种代码 struct Edge{ int from,to,cap

【转】网络最大流——EK算法详解

原文  http://blog.csdn.net/a1dark/article/details/11177907 EdmondsKarp算法,简称EK算法,O(m^2n) 因为是初学教程,所以我会尽量避免繁杂的数学公式和证明.也尽量给出了较为完整的代码.本文的目标群体是网络流的初学者,尤其是看了各种NB的教程也没看懂怎么求最大流的小盆友们.本文的目的是,解释基本的网络流模型,最基础的最大流求法,即bfs找增广路法,也就是EK法,全名是Edmond-Karp,其实我倒是觉得记一下算法的全名和来历可

最大流 EK算法 (转)

反复寻找源点s到汇点t之间的增广路径,若有,找出增广路径上每一段[容量-流量]的最小值delta,若无,则结束. 在寻找增广路径时,可以用BFS来找,并且更新残留网络的值(涉及到反向边). 而找到delta后,则使最大流值加上delta,更新为当前的最大流值. (粗体表明需要掌握的概念) 关于反向边: 以下摘至HDOJ的课件和网上的: 首先来看一下基本的网络流最大流模型. 有n个点,有m条有向边,有一个点很特殊,只出不进,叫做源点,通常规定为1号点.另一个点也很特殊,只进不出,叫做汇点,通常规定

HDU-1532 Drainage Ditches (最大流,EK算法模板)

题目大意:最大流的模板题...源点是0,汇点是n-1. 代码如下: # include<iostream> # include<cstdio> # include<cmath> # include<string> # include<vector> # include<list> # include<set> # include<map> # include<queue> # include<