最大流EK算法模板
最近学了下最大流算法,大概思想算是懵懵懂懂了,现在想把模板记录下来,以备后面深刻学习之用。
#include<cstdio>
#include<cstring>
using namespace std; #define _clr(x, y) memset(x, y, sizeof (x))
#define Min(x, y) (x < y ? x : y)
#define INF 0x3f3f3f3f
#define N 210 int map[N][N];
int pre[N], Sta[N];
bool used[N];
int n, m; //bfs判断s--t之间是否还存在增广路
bool bfs(int s, int t)
{
_clr(used, );
_clr(pre, -);
int top=;
Sta[top++] = s;
used[s] = true;
while(top)
{
int v = Sta[--top];
for(int i=; i<=n; i++)
{
if(map[v][i] && !used[i])
{
used[i] = true;
pre[i] = v;
if(i==t)
return true;
Sta[top++] = i;
}
}
}
return false;
} int EK(int s, int t)
{
//初始化最大流为0
int maxFlow=, d; //若s--t之间存在增广路
while(bfs(s, t))
{
d = INF;
//找到最小的可增量
for(int i=t; i!=s; i=pre[i])
d = Min(d, map[pre[i]][i]); //添加反向边,更新残留网络
for(int i=t; i!=s; i=pre[i])
{
map[pre[i]][i] -= d;
map[i][pre[i]] += d;
}
maxFlow += d;
}
return maxFlow;
} int main()
{
int x, y, z;
while(~scanf("%d%d", &m, &n))
{
_clr(map, );
for(int i=; i<m; i++)
{
scanf("%d%d%d",&x, &y, &z);
map[x][y] += z;
}
printf("%d\n",EK(, n));
}
return ;
}
Fulkersion_ford算法和Ekaf算法基本 是一样的,不同之处在与u搜索增广路时,一个用队列保存,一个用栈保存;
#include <cstdio>
#include <cstring>
#include <queue>
#define _clr(x, y) memset(x, y, sizeof(x))
#define Min(x, y) (x < y ? x : y)
#define INF 0x3f3f3f3f
#define N 110
#define M 1005
using namespace std; int edge[N][N], n;
int pre[N], rec[N];
int alpha[N], Sta[N];
int S, T; void Ford_Fulkerson()
{
int maxf=;
while()
{
int top=;
_clr(pre, -);
_clr(alpha, );
pre[S] = S;
alpha[S] = INF;
Sta[top++] = S;
while(top)
{
int u = Sta[--top];
for(int i=; i<=T; i++)
{
if(edge[u][i]> && pre[i]==-)
{
pre[i] = u;
alpha[i] = Min(alpha[u], edge[u][i]);
Sta[top++] = i;
}
}
if(alpha[T]) break;
}
if(alpha[T]==) break; maxf += alpha[T];
for(int i=T; i!=S; i=pre[i])
{
edge[pre[i]][i] -= alpha[T];
edge[i][pre[i]] += alpha[T];
}
}
printf("%d\n", maxf);
} int main()
{
int m, num, k;
while(~scanf("%d%d", &m, &n))
{
int pig[M], last[M];
S=, T=n+;
_clr(edge, );
_clr(last, );
for(int i=; i<=m; i++) scanf("%d", pig+i);
for(int i=; i<=n; i++)
{
scanf("%d", &num);
while(num--)
{
scanf("%d", &k);
if(last[k]==)
edge[S][i] += pig[k];
else
edge[last[k]][i] = INF;
last[k] = i;
}
scanf("%d", &edge[i][T]);
}
Ford_Fulkerson();
}
return ;
}
最大流EK算法模板的更多相关文章
- 二分图的最大匹配——最大流EK算法
序: 既然是个图,并且求边数的最大值.那么这就可以转化为网络流的求最大流问题. 只需要将源点与其中一子集的所有节点相连,汇点与另一子集的所有节点相连,将所有弧的流量限制置为1,那么最大流 == 最大匹 ...
- 最大流的EK算法模板
模板题:洛谷p3376 题目大意: 给出一个网络图,以及其源点和汇点,求出其网络最大流. 基本思路: 套模板 EK的时间复杂度O(V*E^2) EK算法思路: 1.通过BFS拓展合法节点(每个节点在本 ...
- 最大流EK算法/DINIC算法学习
之前一直觉得很难,没学过网络流,毕竟是基础知识现在重新来看. 定义一下网络流问题,就是在一幅有向图中,每条边有两个属性,一个是cap表示容量,一个是flow 表示流过的流量.我们要求解的问题就是从S点 ...
- (通俗易懂小白入门)网络流最大流——EK算法
网络流 网络流是模仿水流解决生活中类似问题的一种方法策略,来看这么一个问题,有一个自来水厂S,它要向目标T提供水量,从S出发有不确定数量和方向的水管,它可能直接到达T或者经过更多的节点的中转,目前确定 ...
- POJ1273 最大流 EK算法
套了个EK的模板 //#pragma comment(linker, "/STACK:16777216") //for c++ Compiler #include <stdi ...
- 最大流——EK算法
一.算法理论 [基本思想] 反复寻找源点s到汇点t之间的增广路径,若有,找出增广路径上每一段[容量-流量]的最小值delta,若无,则结束.在寻找增广路径时,可以用BFS来找,并且更新残留网络的值(涉 ...
- EK算法模板
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> ...
- vector实现最大流EK算法
序: 在之前的文章中实现了不利用STL实现EK算法,效率也较高.这次我们企图简化代码,减少变量的使用与手写模拟的代码. 注意:vector等STL的container在不开O2优化的时候实现同一个效果 ...
- 网络流EK算法模板
\(EK\)算法的思想就是每一次找一条增广路进行增广. 注意几个点: 存图时\(head\)数组要设为\(-1\). 存图的代码是这样的: inline void add(int u, int v, ...
随机推荐
- android之保存偏好设置信息到shareSharedPreferences,轻量级的保存数据的方法
android之保存偏好设置信息到shareSharedPreferences,轻量级的保存数据的方法 SharedPreferences保存数据到xml文件 有时候要保存activity的某些状 ...
- C# winform 窗体 彻底退出窗体的方法
1.this.Close(); 只是关闭当前窗口,若不是主窗体的话,是无法退出程序的,另外若有托管线程(非主线程),也无法干净地退出: 2.Application.Exit(); 强制所有消 ...
- Python-----格式化字符
摘要: Python中 %s . %r Python中也有类似于C中的 printf()格式输出,使用 % 运算符,格式: 格式标记字符串 % 要输出的值组 右边的”值组“若有两个及以上的值则需要用小 ...
- Python学习笔记九-文件读写
1,读取文件: f=open('目录','读写模式',encoding='gbk,error='egiong') 后三项可以不写但是默认是' r'读模式:open函数打开的文件对象会自动加上read( ...
- 环形队列C++实现
大家好,我是小鸭酱,博客地址为:http://www.cnblogs.com/xiaoyajiang 以下鄙人用C++实现了环形队列 /******************************** ...
- NOD32强制卸载工具使用方法【转】
装了ESET NOD32又忘记密码了,无法卸载,怎么办? 以下转自官网:http://faq.eset.com.cn/index.php?pid=254 [适用产品:ESET NOD32 防病毒软件4 ...
- BZOJ 1565 植物大战僵尸
http://www.lydsy.com/JudgeOnline/problem.php?id=1565 思路:由于植物之间有保护关系:(右边的植物保护左边的植物,植物攻击范围内的植物都被保护了),因 ...
- 《Programming WPF》翻译 第8章 4.关键帧动画
原文:<Programming WPF>翻译 第8章 4.关键帧动画 到目前为止,我们只看到简单的点到点的动画.我们使用了To和From属性或者By属性来设计动画--相对于当前的属性值.这 ...
- WPF利用Image实现图片按钮
之前有一篇文章也是采用了Image实现的图片按钮,不过时间太久远了,忘记了地址.好吧,这里我进行了进一步的改进,原来的文章中需要设置4张图片,分别为可用时,鼠标悬浮时,按钮按下时,按钮不可用时的图片, ...
- 画图工具Graphviz安装配置
Graphviz (英文:Graph Visualization Software的缩写)是一个由AT&T实验室启动的开源工具包,用于绘制DOT语言脚本描述的图形.它也提供了供其它软件使用的库 ...