网络流EK算法模板
\(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算法模板的更多相关文章
- 网络流 EK算法模板。
这篇博客讲得很好 #include<queue> #include<stdio.h> #include<string.h> using namespace std; ...
- Drainage Ditches(网络流(EK算法))
计算最大流,EK算法模板题. #include <stdio.h> #include <string.h> #include <queue> using names ...
- 网络流EdmondsKarp算法模板理解
先推荐一个讲网络流的博客,我的网络流知识均吸收于此 传送门 EdmondsKarp算法基本思想:从起点到终点进行bfs,只要存在路,说明存在增广路径,则取这部分路 权值最小的一部分,即为增广路径( ...
- 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算法模板
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> ...
- 最大网络流 EK 算法
网络流是什么类型的问题,看一道题目你就知道了 点击打开链接 . 默认具备图论的基本知识,网络流概念比较多,先看看书熟悉一下那些概念.比较好!一个寄出的网络最大流.EK算法写的. 这是一幅网络,求S ...
- 最大流的EK算法模板
模板题:洛谷p3376 题目大意: 给出一个网络图,以及其源点和汇点,求出其网络最大流. 基本思路: 套模板 EK的时间复杂度O(V*E^2) EK算法思路: 1.通过BFS拓展合法节点(每个节点在本 ...
- HDU1532 Drainage Ditches 网络流EK算法
Drainage Ditches Problem Description Every time it rains on Farmer John's fields, a pond forms over ...
- POJ 1273 Drainage Ditches(网络流dinic算法模板)
POJ 1273给出M条边,N个点,求源点1到汇点N的最大流量. 本文主要就是附上dinic的模板,供以后参考. #include <iostream> #include <stdi ...
随机推荐
- Burp Suite 实战指南--说明书
burp使用指南 网址:https://t0data.gitbooks.io/burpsuite/content/
- 最全的计算机Java毕业设计题目大全 附 源码
本文提供数百个计算机毕设题目可以参考 并提供成品源码下载,都是从网上收集而来 源码技术全部采用java+MySQL开发,并结合了其他技术如ssm,ssh,jsp等等. 下载链接在文末! 以下是项目名称 ...
- windows2016_x64搭建ELK(datasource->filebeat->logstash->elasticsearch->kibana)
windows2016_x64搭建ELK(datasource->filebeat->logstash->elasticsearch->kibana) 本文示例日志程序基于as ...
- 【47】迁移学习(Transfer Learning)
迁移学习(Transfer Learning) 如果你要做一个计算机视觉的应用,相比于从头训练权重,或者说从随机初始化权重开始,如果你下载别人已经训练好网络结构的权重,你通常能够进展的相当快,用这个作 ...
- java Spring boot Docker打包
https://blog.csdn.net/Stephanie_1/article/details/88831993
- Java-算式填符号
题目: 某批警察叔叔正在进行智力训练:1 2 3 4 5 6 7 8 9 = 110 请看上边的算式,为了使等式成立,需要在数字间填入加号或者减号(可以不填,但不能填入其它符号).之间没有填入符号的数 ...
- ECMAScript基本对象——Number 对象
Number 对象,原始数值的包装对象. 1.创建 var num = new Number(value); 2.方法 toExponential(x)把对象的值转换为指数计数法. toFixed(x ...
- C语言 typedef struct _STUDENT {}STUDENT,*PSTUDENT;
#include <stdio.h> #include <stdlib.h> #include <string.h> //给stuct _STUDENT 起一个别名 ...
- 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 ...
- Charles抓包问题
Charles抓包问题 抓包失败解决方法之一:在proxy下的Recording Setting找到解决方法 找到里面的include 把勾去掉,点击OK,然后就恢复正常可以抓包了.