\(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. [CF1311C] Perform the Combo

    Solution 前缀和搞一下即可 #include <bits/stdc++.h> using namespace std; #define int long long const in ...

  2. 【MVC+EasyUI实例】对数据网格的增删改查(下)

    前言 继上文对网格加载数据,本文主要阐述对数据增删改的实现. 一.js代码 function Add() { $("#dlg").dialog('open'); $("# ...

  3. qt creator源码全方面分析(2-4)

    目录 Qt Creator API Reference 库 核心库 其他库 插件 Qt Creator API Reference Qt Creator的核心基本上只是一个插件加载器.所有功能都在插件 ...

  4. 数据类型(8种)和运算符——Java

    一.什么是标识符,它有什么作用(重点掌握) 1. 标识符指的是 标识符是用户编程时使用的名字,用于给变量.常量.函数.语句块等命名,以建立起名称与使用之间的关系.标识符可由任何字母数字字符串形成. 2 ...

  5. 字符串问题----去掉字符串中连续出现K个0的子串

    去掉字符串中连续出现K个0的子串 给定一个字符串str,和一个整数k, 如果str中正好有连续K 个'0'字符出现,把连续的 k 个 '0'去掉,返回处理后的子串. [解题思路] 1. 定义两个变量, ...

  6. openssl 生成免费证书

    原文链接:https://www.cnblogs.com/tugenhua0707/p/10927722.html 一:什么是openssl? 它的作用是?应用场景是什么? 即百度百科说:openss ...

  7. laravel上传git如何忽略你不想提交的文件

    1.在文件根目录下面有一个文件 .gitignore .gitignore文件用来忽略被指定的文件或文件夹的改动,被记录在.gitignore文件里的文件或文件夹,是无法被git跟踪到的,换句话说,被 ...

  8. poj1141题解

    题意 空序列是规则序列:用小括号(或者方括号)把一个规则序列括起来依然是规则序列:两个规则序列并列在一起仍然是规则序列. 给出一个括号字符串S,求一个规则序列ANS,满足S是ANS的子序列且ans尽可 ...

  9. Java参数传递是值传递还是引用传递?

    当一个对象被当作参数传递到一个方法后,在此方法内可以改变这个对象的属性,那么这里到底是值传递还是引用传递? 答:是值传递.Java 语言的参数传递只有值传递.当一个实例对象作为参数被传递到方法中时,参 ...

  10. 文件包含漏洞(DVWA环境中复现)

    LOW: 源代码: <?php // The page we wish to display $file = $_GET[ 'page' ]; ?> 可以看到,low级别的代码对包含的文件 ...