例题:  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算法的更多相关文章

  1. 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) ...

  2. 最大网络流 EK 算法

    网络流是什么类型的问题,看一道题目你就知道了 点击打开链接 . 默认具备图论的基本知识,网络流概念比较多,先看看书熟悉一下那些概念.比较好!一个寄出的网络最大流.EK算法写的. 这是一幅网络,求S   ...

  3. 网络流EK算法模板

    \(EK\)算法的思想就是每一次找一条增广路进行增广. 注意几个点: 存图时\(head\)数组要设为\(-1\). 存图的代码是这样的: inline void add(int u, int v, ...

  4. HDU1532 Drainage Ditches 网络流EK算法

    Drainage Ditches Problem Description Every time it rains on Farmer John's fields, a pond forms over ...

  5. Drainage Ditches(网络流(EK算法))

    计算最大流,EK算法模板题. #include <stdio.h> #include <string.h> #include <queue> using names ...

  6. HDU 3549 基础网络流EK算法 Flow Problem

    欢迎参加——BestCoder周年纪念赛(高质量题目+多重奖励) Flow Problem Time Limit: 5000/5000 MS (Java/Others)    Memory Limit ...

  7. 网络流 EK算法模板。

    这篇博客讲得很好 #include<queue> #include<stdio.h> #include<string.h> using namespace std; ...

  8. ACM/ICPC 之 网络流入门-EK算法(参考模板)(POJ1273)

    基于残留网络与FF算法的改进-EK算法,核心是将一条边的单向残留容量的减少看做反向残留流量的增加. //网络流 //EK算法 //Time:16Ms Memory:348K #include<i ...

  9. ACM/ICPC 之 ACM计算机工厂-EK算法(POJ3436)

    题意有点难读懂 //网络流-EK算法-ACM计算机工厂-构图重点 //Time:0Ms Memory:208K #include <iostream> #include<cstrin ...

随机推荐

  1. 浅谈MVVM

    MVVM 模式将 Presenter 改名为 ViewModel,基本上与 MVP 模式完全一致. 唯一的区别是,它采用双向绑定(data-binding):View的变动,自动反映在 ViewMod ...

  2. TOR的十个最好的替代工具

    TOR的十个最好的替代工具: 一.Comodo Dragon(基于Chromium) TOR基于Firefox,因为我们换个口味,首先推荐一个基于开源项目Chromium的Comodo Dragon, ...

  3. Jackson 工具类使用及配置指南

    目录 前言 Jackson使用工具类 Jackson配置属性 Jackson解析JSON数据 Jackson序列化Java对象 前言 Json数据格式这两年发展的很快,其声称相对XML格式有很对好处: ...

  4. Vue + Element UI 实现权限管理系统(第三方图标库)

    使用第三方图标库 用过Elment的同鞋都知道,Element UI提供的字体图符少之又少,实在是不够用啊,幸好现在有不少丰富的第三方图标库可用,引入也不会很麻烦. Font Awesome Font ...

  5. Guns后台管理系统框架(毕业设计神器)

    Guns后台管理系统, 基于Spring Boot + Maven构建  + MyBatis + MySql数据库 导入Eclipse即可使用 十分钟即可搞定,做毕业设计的好帮手啊 最终效果图 登陆页 ...

  6. [Linux]Linux下yaf发送IPV4和IPV6的IPfix

    一.IPFIX与NetFlow 一.IPFIX 全称IP Flow Information Export,即IP流信息输出,是网络流量监测的国际标准.IPFIX是IETF的一个工作组,它的主要工作就是 ...

  7. C/C++知识补充 (1)

    ● C++的圆括号运算符() 下列关于圆括号运算符的功能说法不正确的是(C) . A. 可用于强制类型转换 B 可用于类型构造 C 可用于类型声明 D 可用于函数调用 对大部分可重载的运算符来说,它既 ...

  8. :迭代器模式1:Iterator

    //今天一口气把这一章前半部分的iterator例子的所有代码写完,涉及到了不少指针的内容,竟然一次性编译通过.... //Iterator与Menu之间应该不是has a的关系,先这样着吧. #if ...

  9. Cracking The Coding Interview 1.4

    //Write a method to decide if two strings are anagrams or not. // // 变位词(anagrams)指的是组成两个单词的字符相同,但位置 ...

  10. OJ_查找二叉树

    #include<iostream>using namespace std;int n,m;int d[120];int t=1;int re;struct Node{ int data; ...