最大流算法总结

求解最大流的四种算法介绍、利用最大流模型解题入门 上一篇中介绍了网络流的基础,最大流最小割定理的证明,下面来看如何求一个容量网络的最大流,这里介绍四种算法:EK算法、SAP算法、DINIC算法、HLPP算法。这四种算法中,前三种基于增广路,最后一种基于预流推进。 基于增广路的算法 Ford-Fulkerson算法 先来简单提一下Ford-Fulkerson算法。 在上一节中证明了,如果一个可行流中没有增广路,那么此时这个可行流的流量就是最大流,因... 阅读详情

问题描述:

        最大流问题是网络流中的基本问题,是基于有向图的 可以用于解决最小割,二分图匹配等问题。

例题:

https://acm.hdu.edu.cn/showproblem.php?pid=1532https://acm.hdu.edu.cn/showproblem.php?pid=1532icon-default.png?t=L892https://acm.hdu.edu.cn/showproblem.php?pid=1532

Drainage Ditches

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 29214    Accepted Submission(s): 13686


 

Problem Description
Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover patch. This means that the clover is covered by water for awhile and takes quite a long time to regrow. Thus, Farmer John has built a set of drainage ditches so that Bessie's clover patch is never covered in water. Instead, the water is drained to a nearby stream. Being an ace engineer, Farmer John has also installed regulators at the beginning of each ditch, so he can control at what rate water flows into that ditch. 
Farmer John knows not only how many gallons of water each ditch can transport per minute but also the exact layout of the ditches, which feed out of the pond and into each other and stream in a potentially complex network. 
Given all this information, determine the maximum rate at which water can be transported out of the pond and into the stream. For any given ditch, water flows in only one direction, but there might be a way that water can flow in a circle. 
 

Input
The input includes several cases. For each case, the first line contains two space-separated integers, N (0 <= N <= 200) and M (2 <= M <= 200). N is the number of ditches that Farmer John has dug. M is the number of intersections points for those ditches. Intersection 1 is the pond. Intersection point M is the stream. Each of the following N lines contains three integers, Si, Ei, and Ci. Si and Ei (1 <= Si, Ei <= M) designate the intersections between which this ditch flows. Water will flow through this ditch from Si to Ei. Ci (0 <= Ci <= 10,000,000) is the maximum rate at which water will flow through the ditch.
 

Output
For each case, output a single integer, the maximum rate at which water may emptied from the pond. 
 

Sample Input
 
 
5 4 1 2 40 1 4 20 2 4 20 2 3 30 3 4 10
 

Sample Output
 
 
50
 

Source

 本质:

最大流问题就是求二点之间的最大流速

想要遵守的原则:

1)流量守恒

2)反对称性

3)容量限制

方法总结:

1)增广路 Edmonds-Karp  Dinic算法

2)预流推进算法 ISAP 算法

Edmonds-Karp算法:

先附上例题:https://blog.youkuaiyun.com/m0_57006708/article/details/120441920​​​​​​

       思路: 

用BFS来计算增广路径 直到无法搜索到增广路径时候返回

残留网络的利用

每次BFS完 找到最大流时候 

从t到s进行回溯 对正向流-取最大流 反向流-最大流

/*
*@Author:   GuoJinlong
*@Language: C++
*/
//#include <bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<list>
#include<set>
#include<iomanip>
#include<cstring>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<cassert>
#include<sstream>
#include<algorithm>
using namespace std;
const int mod=1e9+7;
typedef long long  ll;
#define ls (rt<<1)
#define rs (rt<<1|1)
#define mid (l+r)/2
#define mms(x, y) memset(x, y, sizeof x)
#define over(i,s,t) for(register long long i=s;i<=t;++i)
#define lver(i,t,s) for(register long long i=t;i>=s;--i)
const int MAXN = 305;
const int INF = 0x3f3f3f3f;
const int N=5e4+7;
const int maxn=1e5+5;
const double EPS=1e-10;
const double Pi=3.1415926535897;
//inline double max(double a,double b){
//    return a>b?a:b;
//}
//inline double min(double a,double b){
//    return a<b?a:b;
//}
 
int xd[8] = {0, 1, 0, -1, 1, 1, -1, -1};
int yd[8] = {1, 0, -1, 0, -1, 1, -1, 1};
 

//start
int n,m;
int g[10010][10010];
int pre[10010];
int bfs(int s,int t){
    int flow[10010];
    mms(pre,-1);
    flow[s]=INF; //初始化起点
    pre[s]=0;
    queue<int>q;
    q.push(s);
    while (!q.empty()) {
        int u=q.front();
        q.pop();
        if(u==t) break; //到达终点退出
        for(int i=1;i<=m;i++){ //BFS所有的点
            if(i!=s&&g[u][i]>0&&pre[i]==-1){
                pre[i]=u; //记录途径
                q.push(i);
                flow[i]=min(g[u][i],flow[u]); //更新结点流量
            }
        }
    }
    if(pre[t]==-1) return -1; //没有找到增广路
    return flow[t];//返回该路的流量
}
int maxflow(int s,int t){
    int MaxFlow=0;
    while (1) {
        int flow=bfs(s,t); //搜索最大流
        if(flow==-1) break; //没有找到新的增广路 退出
        int cur=t; //终点开始更新
        while (cur!=s) {
            int father=pre[cur]; //更新残留网络
            g[father][cur]-=flow; //正向+反向-
            g[cur][father]+=flow;
            cur=father;
        }
        MaxFlow+=flow;
    }
    return MaxFlow;
}

int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        int a,b,c;
        cin>>a>>b>>c;
        g[a][b]+=c; //可能有重边
    }
    cout<<maxflow(1,m);
}
//end

最大流问题之FF算法与EK算法 目录 问题描述: EK算法: 算法描述: 伪代码: 例子: 控制台对应输出为: 关键定理证明: 最大流最小割定理: 1推2: 2推3: 3推1: 时间复杂度分析 分析 关键边定义: 时间复杂度计算: FF算法: FF算法介绍 FF算法缺陷分析: 问题描述: G=(V,E)是一个有向图,其中每条边(u,v)有一个非负的容量值c(u,v),而且如果E中包含一条边... 阅读详情

相关推荐

使用openair包分析气象数据

气象数据通常是有规律的时间序列,分析气象数据时需要对空气质量测量、气象数据和扩散模型输出进行分析。openair 是用于分析空气质量数据或更广泛的大气成分数据的R软件包。该软件包广泛应用于学术界、公共和私营部门。该项目最初由英国自然环境研究委员会(NERC)资助,并由英国环境部(Defra)提供额外资金。

Christina 2518

用优先队列求第K小的数

#include<iostream> #include<cstdio> #include<queue> #include<bitset> #include<cstring> #include<algorithm> #define mod 100000007 using namespace std; typedef long ...

没有梦想何以远行 1967

BMW Standard Tools 宝马FSC工具套装下载

这是一款非常专业的一套宝马编码工具,懂行的人自然知道他的用处,不懂行的人,我解释再多也不会明白的,需要的拿去吧。软件名:BMW Standard Tools包含工具:BMW Coding Tool v2.50、change Language、CIC Mafia、Dr.Gini B021、EasyConnect、EDIABAS Konfigurator v1.1、EDIABAS Konfigurator v2.0.0、FSC-Tools_2.18、FSTool_v2_CarServer、INPA、ITool

Zj_arrow的博客 6998

1004. Counting Leaves (30)

#include&lt;cstdio&gt; #include&lt;cstring&gt; #include&lt;iostream&gt; #include&lt;sstream&gt; #include&lt;algorithm&gt; #include&lt;cctype&gt; #include&lt;vector&gt; #include&lt;iomanip&gt;

buaapascal的博客 259

Flowable任务节点动态预测:基于任务ID与参数获取下一节点及候选分配策略

本文深入探讨了Flowable工作流引擎中任务节点动态预测功能的实现。通过解析任务ID与运行时参数,模拟流程执行路径,精准预测下一节点及候选用户/组集合,从而提升用户体验与系统透明度。核心在于利用自定义命令实现表达式求值,并深度解析候选者分配策略,确保预测结果与实际流程执行一致。

nnn11的博客 737

【遥感数字图像处理(朱文泉)】第四章 变换域处理方法

变换域的处理方法

甜子yu的博客 4311

第k小【优先队列】

题目链接 题目描述  有一个长度为n的数组,值为 a[i], 牛牛想找到数组中第 k 小的数。比如 1 2 2 3 4 6 中,第 3 小的数就是2.  牛牛觉得这个游戏太简单了,想加一点难度,现在牛牛有 m 个操作,每个操作有两种类型。  1 x 1 代表操作一,给数组中加一个元素 x 。(0 ≤ x ≤ 1e9)  2 2 代表操作二,查询第 k 小的数。如果没有 k 个数就输出−1 输入描述: 第一行有三个整数,n m k,(1≤n,m,k≤2e5) 第二行包含 n 个整数 a[i] (

包子不卖包子 595

看完这篇你就能讲解LLC软开关:一文秒懂 ZVS 和 ZCS 到底啥意思!

想要 MOS 管ZVS 好实现➜ 把工作频率保持在 fr1 或更高。想让整流二极管也ZCS 实现➜ 频率就别高过 fr1。设计磁性元件时,一定要计算好 Lr、Lm、Cr 的值,这直接决定你 fr、fr1 是多少!LLC 的软开关技术不是“魔法”,是电感电容+频率控制的精妙组合;fr1 就像黄金分割点,整流和开关都能“刚刚好”;不是所有软开关都能同时实现,要看你在频率曲线的哪一段!

weixin_43199439的博客 1533

力扣剑指offer40.最小k个数-----优先队列解法c++

力扣剑指offer40

asdasd121312dasd的博客 613

知识图谱大模型系列之 12 LLM 知识图谱构建器:从零到 GraphRAG 使用 LLM 知识图谱生成器在 GenAI 应用中提取和使用知识图谱(教程含源码)

为了更深入地了解 LLM 知识图谱构建器,GitHub 存储库提供了大量信息,包括源代码和文档。此外,我们的文档提供了详细的入门指南,而GenAI 生态系统则提供了有关可用更广泛工具和应用程序的进一步见解。

iCloudEnd的博客 2037

【OS】AUTOSAR OS系统调用产生Trap的过程详解

AUTOSAR OS系统调用产生Trap的过程详解

qq_36056498的博客 2438

剑指offer-29 -- 最小的K个数 - C++

题目描述 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。 方法一:排序 直接排序,然后去前k小数据。 时间复杂度:O(nlongn) 空间复杂度:O(1) 方法二:堆排序 建立一个容量为k的大根堆的优先队列。遍历一遍元素,如果队列大小<k,就直接入队,否则,让当前元素与队顶元素相比,如果队顶元素大,则出队,将当前元素入队 代码 class Solution { public: vector<int

小白_努力 375

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

最大流算法

最大流算法 网络流基础概念 网络流 在一个有向图G=(V,E)G= (V,E)G=(V,E)中: 有一个唯一的源点S(入度为000:出发点) 有一个唯一的汇点T(出度为000:结束点) 图中的每一条边都一个非负的权值,这个权值叫做容量c(u,v)c(u, v)c(u,v) 满足上述条件的图GGG称为网络流图,记为G=(V,E,C)G= (V,E,C)G=(V,E,C) 可以想象成,如果把每条边...

Psychosocial的博客 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

最大流的四种常用算法

最大流的四种常用算法 本博客仅用于记录博主自己的代码,只有代码会有注释,若是初学者想进行学习可以移步到最大流 — Edmond Karp算法里面主要讲述了最大流的EK算法,另外的几种算法也有推荐的大佬博客基本可以学会最大流算法。 最大流算法可以说有五种(FF , EK ,Dinic, ISPA, HLPP) 第一种是最暴力的dfs来实现的基本都会有超时的风险,所以不贴出代码 基础模板题:P3376 【模板】网络最大流 进阶毒瘤模板题:P4722 【模板】最大流 加强版 / 预流推进 值得一提的是前四

梅子酒的博客 5392

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

图算法-最大流

形式定义 流网络: 源结点 s,汇点 t,每个结点都在从源结点到汇点的某条路径上 流网络G中的流 是一个实值函数f: V * V -> R 流满足两条性质: (流量守恒:流入结点的总流量等于流出结点的总流量(除源结点与汇点以外)) 流 f 的值 | f | 即从源结点流出的总流量减去流入源结点的总流量 最大流问题 :给定一个流网络G、一个源结点、一个汇点,求值最大的流 残存网络 G_f...

Iam_Human的博客 2466

最大流之EK算法

刚刚复习了最大流算法,温习了 Edmons-Karp 算法的思想和简单步骤后,第一次写的是用结构体包装节点和边, 不过后来发现这样虽然一定程度上使代码更加容易理解,但是调用变量的语句长了许多,于是还是采用数据的方式。 这样速度会快不少。以下是我写的最大流算法。发现错误或不足之处希望留言提醒更正。 #include&lt;iostream&gt; #include&lt;stdio.h&gt; #i...

BlackCarDriver的博客 664

算法之最大流

原创路径:http://www.wutianqi.com/?p=3107 转自:http://blog.youkuaiyun.com/xiaoxin_ling/article/details/19970179 Edmond Karp算法的大概思想: 反复寻找源点s到汇点t之间的增广路径,若有,找出增广路径上每一段[容量-流量]的最小值delta,若无,则结束。 在寻找增广路径时,可以用

飞奔的蜗牛 532

网络流 最大流模板算法 FF算法 Dinic算法

介绍求最大流的两种常用算法:1:FF算法 2:Dinic算法 Dinic算法是FF算法的优化 这两篇代码可以作为自己求最大流的两种模板算法 配套题目,以题目为背景代入: https://www.luogu.com.cn/problem/P3376 1:FF算法 #include <bits/stdc++.h> using namespace std; const...

aiwo1376301646的博客 612

Python算法分析与设计:最大流算法

Python算法分析与设计:最大流算法 一、实验目的 1、掌握最大流问题的定义,了解流量、容量以及他们之间的关系。 2、掌握通过增广路径求最大流问题的Forder-Fulkerson和Edmond-Karp算法,理解这两个算法之间的异同 3、了解将计算问题转换为最大流问题的基本流程。掌握通过最大流算法求解二向图最大匹配和文件传输中的不重合边等问题的方法。 二、实验工具 Win10操作系统、pyth...

加号的博客 5970

最大流问题以及FF算法

最大流问题问题描述:给定指定的一个有向图,其中有两个特殊的点源S(Sources)和汇T(Sinks),每条边有指定的容量(Capacity),求满足条件的从S到T的最大流(MaxFlow).约束条件:设 G = (V, E) 是一个流网络,其容量函数为 c。设 s 为网络的源点,t 为汇点。G 的流的一个实值函数 f:V×V → R,且满足下列三个性质:容量限制(Capacity Constrai

王小超的博客 8116

算法9-5:最大流算法的Java代码

残留网络 在介绍最大流算法之前先介绍一下什么是残留网络。残余网络的概念有点类似于集合中的补集概念。 下图是残余网络的例子。上面的网络是原始网络,下面的网络是计算出的残留网络。残留网络的作用就是用来描述这个网络中还剩下多少可以利用的流量。 流量网络 最大流算法比以前介绍的算法都要复杂。网络中的

白色咖啡 3332

初步网络最大流的算法及详解

                  网络最大流   众所周知,网络流是图论的一个很重要的内容,也很有难度(主要难在建模)。   网络流的基础概念这里提一下:   容量网络:设G(V,E),是一个有向网络,在V中指定了一个顶点,称为源点(记为Vs),以及另一个顶点,称为汇点(记为Vt);对于每一条弧<u,v>属于E,对应有一个权值c(u,v)>0,称为弧的容量.通常...

weixin_30770783的博客 2810

算法学习笔记 网络流之最大流算法

文章目录26.1 流网络1. 流网络和流2. 流的一个例子3. 使用反平行边来建模问题4. 具有多个源点和多个汇点的网络26.2 *Ford-Fulkerson* 方法1. 残存网络2. 增广路径3. 基本的 *Ford-Fulkerson* 算法 我们可通过模型化道路交通图为一个有向图、找到从一个城市到另一个城市之间的最短路径,我们也可以将一个有向图看作是一个流网络 flow network 、并使用它来回答关于物料流动方面的问题。设想一种物料从产生它的源结点、经过一个系统、流向消耗该物料的汇点这样一个过

memcpy0的博客 2761

最大流 — Edmond Karp算法

Edmond Karp算法的大概思想: 反复寻找源点s到汇点t之间的增广路径,若有,找出增广路径上每一段[容量-流量]的最小值delta,若无,则结束。 在寻找增广路径时,可以用BFS来找,并且更新残留网络的值(涉及到反向边)。 而找到delta后,则使最大流值加上delta,更新为当前的最大流值。 (粗体表明需要掌握的概念)   关于反向边: 以

AC_Dreameng 1619

最大流算法入门

概念: 容量网络:设G(V,E),是一个有向网络,在V中指定了一个顶点,称为源点(记为Vs),以及另一个顶点,称为汇点(记为Vt);对于每一条弧<u,v>属于E,对应有一个权值c(u,v)>0,称为弧的容量.通常吧这样的有向网络G称为容量网络. 弧的流量:通过容量网络G中每条弧<u,v>,上的实际流量(简称流量),记为f(u,v); 网络流:所有弧上流...

201
上一篇: 送外卖2(三进制状态dp+最短路)
下一篇: Travel(SPFA+思维)
郭晋龙
博客等级 码龄6年 940粉丝 449原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郭晋龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值