网络流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 ...
随机推荐
- Astah Professional安装
asish安装 1● 文件下载 2● 安装图解 3● 破解 replace 4● 测试 success
- C#执行Sql 时,出现“算术运算导致溢出”问题,如何解决?
昨天在C#执行oracle的sql语句时,总是报错,原先在pl/sql 执行sql语句是可以的,在C#执行就报“算术运算导致溢出”问题 SQL语句 select A.SKU_ID 商品标识,A.COL ...
- Gameobject.Find和Transform.Find应用区别
using UnityEngine;using System.Collections; public class test : MonoBehaviour{ private GameObject ro ...
- MyBatis逆向工程:根据table生成Model、Mapper、Mapper.xml
逆向工程工具 下载地址:https://download.csdn.net/download/zhutouaizhuwxd/10779140 1.工程导入Eclipse 2.运行MainUI.jav ...
- asp.net webapi 返回json结果的方法
第一种: public static void Register(HttpConfiguration config) { //1.将默认的xml格式化程序清除 GlobalConfiguration. ...
- list的四种遍历方式
1.手先增强for循环和iterator遍历的效果是一样的,也就说 增强for循环的内部也就是调用iteratoer实现的,但是增强for循环 有些缺点,例如不能在增强循环里动态的删除集合内容.不能获 ...
- 【转载三】Grafana系列教程–Grafana的配置及运行
本篇文章,就让我们来了解下,Grafana的简单配置及运行. 详细的配置我们后面会讲,本篇文章只对其配置做一个简单了解,主要是让大家了解Grafana的配置及启动的过程及方法. 更多Grafana问题 ...
- 源码学习:一个express().get方法的加载与调用
刚刚接触express,它的中间件确实把我搞得头晕.get的回调中要不要加next?不加载还会执行下一个中间件么?给get指定'/'路径是不是所有以'/'开头的访问在没有确切匹配时都能执行?use件又 ...
- Cracking The Coding Interview 4.4
//Given a binary search tree, design an algorithm which creates a linked list of all the nodes at ea ...
- SQL-27 给出每个员工每年薪水涨幅超过5000的员工编号emp_no、薪水变更开始日期from_date以及薪水涨幅值salary_growth,并按照salary_growth逆序排列。 提示:在sqlite中获取datetime时间对应的年份函数为strftime('%Y', to_date)
题目描述 给出每个员工每年薪水涨幅超过5000的员工编号emp_no.薪水变更开始日期from_date以及薪水涨幅值salary_growth,并按照salary_growth逆序排列. 提示:在s ...