网络流Ek算法
例题: Flow Problem HDU - 3549
Edmonds_Karp算法其实是不断找增广路的过程.
但是在找的过程中是找"最近"的一天增广路,
而不是找最高效的一条增广路,
而且还会重复找,
所以复杂度也是爆表的,很容易被卡. 所以有Dinic和ISAP这两个更加优秀的算法.
我的板子
struct Edge {
int lst, from, to, cap, flow;
Edge () { }
Edge (int ll, int ff, int tt, int cc, int fff) : lst(ll), from(ff), to(tt), cap(cc), flow(fff) { }
}; const int maxn = ;
const int inf = 0x3f3f3f3f; class Edmonds_karp {
public:
Edge edge[maxn*];
int head[maxn];
int cn, cm;
int csz;
int path[maxn];
int deta[maxn]; void init(int n, int m) {
cn = n; cm = m;
memset(head, , sizeof(head));
csz = ; // 注意 这儿应该是偶数开始 因为 奇数^1等价于减1 偶数^1等价于加一.
// 因为我前向星是以0为结尾的 所以我必须从2开始.
} void add(int u, int v, int c) {
edge[csz] = Edge(head[u], u, v, c, );
head[u] = csz++;
edge[csz] = Edge(head[v], v, u, , ); // 反向边,记得容量为0, 但是有些情况是可以修改的. 例如在建无向图的时候.
head[v] = csz++;
} int maxflow(int st, int ed) {
int res = ;
int i, u, v, cap, flow;
while (true) {
// 找增广路
memset(deta, , sizeof(deta));
queue<int> q;
q.push(st);
deta[st] = inf;
while (!q.empty()) {
u = q.front(); q.pop();
for (i=head[u]; i; i=edge[i].lst) {
v = edge[i].to; cap = edge[i].cap; flow = edge[i].flow;
if (!deta[v] && cap > flow) { // 该点未被增广, 同时可流
deta[v] = min(deta[u], cap - flow); // 限流
path[v] = i; // 记录路径
q.push(v);
}
}
if (deta[ed]) break; // 找到一条增广路了.
}
if (!deta[ed]) break; // 如果找不到增广路就说明最大流了,结束.
for (i=path[ed]; i!=path[st]; i=path[edge[i].from]) { // 更新残量图
edge[i].flow += deta[ed];
edge[i^].flow -= deta[ed];
}
res += deta[ed];
}
return res;
}
}Ek;
紫书模板:
struct Edge {
int from, to, cap, flow;
Edge (int u, int v, int c, int f) : from(u), to(v), cap(c), flow(f) { }
}; struct EdmondsKarp {
int n, m;
vector<Edge> edges;
vector<int> G[maxn];
int a[maxn];
int p[maxn];
void init(int n) {
this->n = n;
for (int i=0; i<=n; ++i) G[i].clear(), edges.clear();
}
void add(int u, int v , int val) {
edges.push_back(Edge(u, v, val, ));
edges.push_back(Edge(v, u, , ));
m = edges.size();
G[u].push_back(m-);
G[v].push_back(m-);
} int Maxflow(int s, int t) {
int flow = ;
while () {
memset(a, , sizeof(a));
queue<int> Q;
Q.push(s);
a[s] = inf;
while (!Q.empty()) {
int x = Q.front(); Q.pop();
for (int i=; i<G[x].size(); ++i) {
Edge &e = edges[G[x][i]];
if (!a[e.to] && e.cap > e.flow) {
p[e.to] = G[x][i];
a[e.to] = min(a[x], e.cap - e.flow);
Q.push(e.to);
}
}
if (a[t]) break;
}
if (!a[t]) break;
for (int u = t; u!=s; u =edges[p[u]].from) {
edges[p[u]].flow += a[t];
edges[p[u]^].flow -= a[t];
}
flow += a[t];
}
return flow;
}
}Ek;
网络流Ek算法的更多相关文章
- POJ 1459 网络流 EK算法
题意: 2 1 1 2 (0,1)20 (1,0)10 (0)15 (1)20 2 1 1 2 表示 共有2个节点,生产能量的点1个,消耗能量的点1个, 传递能量的通道2条:(0,1)20 (1,0) ...
- 最大网络流 EK 算法
网络流是什么类型的问题,看一道题目你就知道了 点击打开链接 . 默认具备图论的基本知识,网络流概念比较多,先看看书熟悉一下那些概念.比较好!一个寄出的网络最大流.EK算法写的. 这是一幅网络,求S ...
- 网络流EK算法模板
\(EK\)算法的思想就是每一次找一条增广路进行增广. 注意几个点: 存图时\(head\)数组要设为\(-1\). 存图的代码是这样的: inline void add(int u, int v, ...
- HDU1532 Drainage Ditches 网络流EK算法
Drainage Ditches Problem Description Every time it rains on Farmer John's fields, a pond forms over ...
- Drainage Ditches(网络流(EK算法))
计算最大流,EK算法模板题. #include <stdio.h> #include <string.h> #include <queue> using names ...
- HDU 3549 基础网络流EK算法 Flow Problem
欢迎参加——BestCoder周年纪念赛(高质量题目+多重奖励) Flow Problem Time Limit: 5000/5000 MS (Java/Others) Memory Limit ...
- 网络流 EK算法模板。
这篇博客讲得很好 #include<queue> #include<stdio.h> #include<string.h> using namespace std; ...
- ACM/ICPC 之 网络流入门-EK算法(参考模板)(POJ1273)
基于残留网络与FF算法的改进-EK算法,核心是将一条边的单向残留容量的减少看做反向残留流量的增加. //网络流 //EK算法 //Time:16Ms Memory:348K #include<i ...
- ACM/ICPC 之 ACM计算机工厂-EK算法(POJ3436)
题意有点难读懂 //网络流-EK算法-ACM计算机工厂-构图重点 //Time:0Ms Memory:208K #include <iostream> #include<cstrin ...
随机推荐
- Oracle 12c新特性之——TABLE ACCESS BY INDEX ROWID BATCHED
Oracle12c开始,我们在获取SQL语句的执行计划时,也会经常看到"TABLE ACCESS BY INDEX ROWID BATCHED"操作,那么,这个操作到底是什么意思呢 ...
- powerdesidgner1
'******************************************************************************'* File: comment2name ...
- vs2015如何使用附加进程调试发布在IIS上项目
1.如何使用附加进程调试IIS上的网站项目 1)在IIS部署一个网站项目 2)保证浏览器可访问(比如访问登陆页面) 3)在项目中LoginController断点,并在工具栏的调试找到附加到进程 4) ...
- js如何简单实现汉字转成拼音的功能
最近项目需要一个功能,实现汉字转拼音功能,具体比如说输入一个“你好”,同时带出对应拼音“NiHao”,在此做一下记录 1.首先引入两个文件 <script src="jquery.mi ...
- char和varchar、浮点数和定点数
cmd连接mysql数据库:找到mysql目录,进入到bin目录,然后在命令行中输入 mysql -hlocalhost -uroot -ppass ,连接mysql数据库成功. 1.char和var ...
- static与全局变量区别
作用域不同: 全局变量是不显式用static修饰的全局变量,但全局变量默认是动态的,作用域是整个工程,在一个文件内定义的全局变量,在另一个文件中,通过extern 全局变量名的声明,就可以使用全局变量 ...
- 【原创】paintEvent()函数显示文本
[代码] void MainWindow::paintEvent(QPaintEvent*) { QPainter p(this); QRect r; p.setPen(Qt::red); p.dra ...
- tidb使用坑记录
转载自:https://www.cnblogs.com/linn/p/8459327.html tidb使用坑记录 1.对硬盘要求很高,没上SSD硬盘的不建议使用 2.不支持分区,删除数据是个大坑. ...
- 据说excel流是这么做,上次我分享的是csv格式。这个是excel格式。
import xlwt import StringIO import web urls = ( '/rim_request','rim_request', '/rim_export','rim_exp ...
- PyCharm进行远程开发和调试linux服务器
简介: 或许我也应该迁移到linux环境去开发. 最近写的一些小东西,在wnidows上开发,在windows上调试,都很正常.可是一旦放进linux服务器,就歇菜了. 那么我们有什么办法处理这个wi ...