\(EK\)算法的思想就是每一次找一条增广路进行增广。

注意几个点:

  • 存图时\(head\)数组要设为\(-1\)。
  • 存图的代码是这样的:
inline void add(int u, int v, int w)
{
ver[tot] = v, fro[tot] = u, edge[tot] = w, nxt[tot] = head[u], head[u] = tot++;
ver[tot] = u, fro[tot] = v, edge[tot] = 0, nxt[tot] = head[v], head[v] = tot++;//注意最后才tot++,且需要建流量为0的反边
}

具体实现参考代码:

#include <bits/stdc++.h>
#define itn int
#define gI gi using namespace std; inline int gi()
{
int f = 1, x = 0; char c = getchar();
while (c < '0' || c > '9') {if (c == '-') f = -1; c = getchar();}
while (c >= '0' && c <= '9') x = x * 10 + (c ^ 48), c = getchar();
return f * x;
} const int maxn = 100003; int n, m, s, t, tot, fro[maxn * 2], head[maxn], ver[maxn * 2], nxt[maxn * 2], edge[maxn * 2];
int flow[maxn], pre[maxn], pos[maxn], ans; inline void add(int u, int v, int w)
{
ver[tot] = v, fro[tot] = u, edge[tot] = w, nxt[tot] = head[u], head[u] = tot++;
ver[tot] = u, fro[tot] = v, edge[tot] = 0, nxt[tot] = head[v], head[v] = tot++;
} queue <int> q; inline int Max_flow(int s, int t)
{
memset(pos, -1, sizeof(pos));
memset(pre, -1, sizeof(pre));
while (!q.empty()) q.pop();
q.push(s);
flow[s] = 0x3f3f3f3f;
//以上为初始化
while (!q.empty())
{
int u = q.front(); q.pop();
if (u == t) return flow[u];//找到了一条增广路
for (int i = head[u]; i != -1; i = nxt[i])//遍历出边
{
int v = ver[i], w = edge[i];
if (pre[v] == -1 && w > 0)//下一个点还可以增广
{
pre[v] = u;//记录前驱
pos[v] = i;//记录当前边的编号
flow[v] = min(flow[u], w);//记录流量
q.push(v);//放入队列
}
}
}
return -1;
} inline void EK(int s, int t)
{
int ins = 0;
while ((ins = Max_flow(s, t)) != -1)//当前还存在增广路
{
int k = t;//向前推进
while (k != s)
{
edge[pos[k]] -= ins;//边的流量减去当前增广出的最大流量
edge[pos[k] ^ 1] += ins;//反边则加上最大流量
k = pre[k];//向前记录
}
ans += ins;//增加答案
}
} int main()
{
n = gi(), m = gi(), s = gi(), t = gi();
memset(head, -1, sizeof(head));//记得初始值设为-1
for (int i = 1; i <= m; i+=1)
{
int u = gi(), v = gi(), w = gi();
add(u, v, w);//建边
}
EK(s, t);//EK算法跑网络流
printf("%d\n", ans);//输出答案
return 0;
}

网络流EK算法模板的更多相关文章

  1. 网络流 EK算法模板。

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

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

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

  3. 网络流EdmondsKarp算法模板理解

    先推荐一个讲网络流的博客,我的网络流知识均吸收于此   传送门 EdmondsKarp算法基本思想:从起点到终点进行bfs,只要存在路,说明存在增广路径,则取这部分路 权值最小的一部分,即为增广路径( ...

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

  5. EK算法模板

    #include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> ...

  6. 最大网络流 EK 算法

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

  7. 最大流的EK算法模板

    模板题:洛谷p3376 题目大意: 给出一个网络图,以及其源点和汇点,求出其网络最大流. 基本思路: 套模板 EK的时间复杂度O(V*E^2) EK算法思路: 1.通过BFS拓展合法节点(每个节点在本 ...

  8. HDU1532 Drainage Ditches 网络流EK算法

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

  9. POJ 1273 Drainage Ditches(网络流dinic算法模板)

    POJ 1273给出M条边,N个点,求源点1到汇点N的最大流量. 本文主要就是附上dinic的模板,供以后参考. #include <iostream> #include <stdi ...

随机推荐

  1. Burp Suite 实战指南--说明书

       burp使用指南 网址:https://t0data.gitbooks.io/burpsuite/content/

  2. 最全的计算机Java毕业设计题目大全 附 源码

    本文提供数百个计算机毕设题目可以参考 并提供成品源码下载,都是从网上收集而来 源码技术全部采用java+MySQL开发,并结合了其他技术如ssm,ssh,jsp等等. 下载链接在文末! 以下是项目名称 ...

  3. windows2016_x64搭建ELK(datasource->filebeat->logstash->elasticsearch->kibana)

    windows2016_x64搭建ELK(datasource->filebeat->logstash->elasticsearch->kibana) 本文示例日志程序基于as ...

  4. 【47】迁移学习(Transfer Learning)

    迁移学习(Transfer Learning) 如果你要做一个计算机视觉的应用,相比于从头训练权重,或者说从随机初始化权重开始,如果你下载别人已经训练好网络结构的权重,你通常能够进展的相当快,用这个作 ...

  5. java Spring boot Docker打包

    https://blog.csdn.net/Stephanie_1/article/details/88831993

  6. Java-算式填符号

    题目: 某批警察叔叔正在进行智力训练:1 2 3 4 5 6 7 8 9 = 110 请看上边的算式,为了使等式成立,需要在数字间填入加号或者减号(可以不填,但不能填入其它符号).之间没有填入符号的数 ...

  7. ECMAScript基本对象——Number 对象

    Number 对象,原始数值的包装对象. 1.创建 var num = new Number(value); 2.方法 toExponential(x)把对象的值转换为指数计数法. toFixed(x ...

  8. C语言 typedef struct _STUDENT {}STUDENT,*PSTUDENT;

    #include <stdio.h> #include <stdlib.h> #include <string.h> //给stuct _STUDENT 起一个别名 ...

  9. PAT (Advanced Level) Practice 1015 Reversible Primes (20 分)

    A reversible prime in any number system is a prime whose "reverse" in that number system i ...

  10. Charles抓包问题

    Charles抓包问题 抓包失败解决方法之一:在proxy下的Recording Setting找到解决方法 找到里面的include 把勾去掉,点击OK,然后就恢复正常可以抓包了.