网络流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 ...
随机推荐
- cobaltstrike使用笔记2
0x01 cs服务端绕过流量检测 定义C2的通信格式,修改CS默认的流量特征 编写Profiles: 开源Profiles:https://github.com/rsmudge/Malleable-C ...
- 解决树莓派鼠标延迟/迟滞问题-转CSDN博主“Deiki”-sunziren
本文转自CSDN: https://blog.csdn.net/deiki/article/details/73252942,因为我在为树莓派安装2.4G无线键鼠的时候,鼠标反应很慢,卡顿严重(换成有 ...
- Linux学习记录(二):常用工具
博主使用的操作系统为Ubuntu tmux 终端分屏 安装 Ubuntu使用apt-get安装 sudo apt-get install tmux 使用 默认命令键:Ctrl + B %(百分号) 左 ...
- 开始Python之旅
2019/11/22,今天是个好日子!非常高兴笔者的博客申请得到通过,让本人有幸成为博客园的一份子! 本人是一枚自然语言处理的爱好者,所用到的语言工具就是python,因此笔者的博客内容主要关乎pyt ...
- java【第三课 条件语句】
一.java条件语句 import java.util.Scanner; //导入扫描仪 public class demo{ public static void main(String[] arg ...
- 内网hash传递
前言: 我们在平常打点的时候,遇到有内网或者有域的环境的时候,我们只获得了内网中的一台机子的shell,由这台机子我们可以获得这台机子所在的网段的相关其他主机.比如说有域的时候的域控机,有多层内网的堡 ...
- HDU6683
题意 英文 做法 考虑公比为\(\frac{a}{b}\),满足\(a>b,(a,b)=1\) 枚举长度\(k\),设序列头为\(p\),尾为\(q\),有\(p\times \frac{a^{ ...
- HTML5,从零开始
一.网页的组成部分 <!DOCTYPE html> <html> <head> <title>这是标题</title> <meta c ...
- 线段树(lazy标记)-- 模板
], lazy[MAXN << ]; void PushUp(int rt) { ans[rt] = ans[rt << ] + ans[rt << | ]; } ...
- docker-储存持久化
docker容器不适合存放数据,重要的数据要用外部卷存储,容器可以挂载真实机目录或者共享存储为卷 储存卷映射 docker run -itd -v 真实机目录:容器目录 镜像:标签 可以做一台nfs服 ...