先来介绍一些基本概念:

网络是指一个有向图G=(V,E),有两个特殊节点:源点S和汇点T。每条有向边(x,y)都有一个权值c(x,y),称为边的容量。如果(x,y)不在图中,那么就有c(x,y)=0.

用f(x,y)表示边(x,y)上的流量,那么c(x,y)-f(x,y)就是边的剩余容量。

通常用f(x,y)/c(x,y)的形式标记边上的流量与容量。

可行流应该满足:

1.容量限制:f(x,y)<=c(x,y)

2.流量守恒:

最大流:从源点流向汇点的最大流量

增广路:一条从源点到汇点的所有边的剩余容量>=0的路径。

残留网:由网络中所有结点和剩余容量大于0的边构成的子图,这里的边包括有向边和其反向边。

建图时每条有向边(x,y)都构建一条反向边(y,x),初始容量c(y,x)=0.构建反向边的目的就是提供一个”退流管道“,一旦前面的增广路堵死可行流,可以通过”退流管道“退流,提供了后悔机制。

EK算法步骤:

先bfs找增广路:

过程:

1.初始化,mf[s]=无穷大,也就是默认起点不限流,将s入队

2.只要队列不空,就将其队头节点出队,并用其进行扩展节点,被其扩展的节点都要更新其最大限制流量并记录每个节点扩展路径的前驱边的编号,便于后续对残留图进行修改,当遇到汇点t时返回true

3.如果bfs过程中没有遇到汇点t,最后返回false

EK求最大流

循环找增广路,如果没有找到增广路就直接返回当前流量的累加值,若找到了增广路则说明流量可以继续扩展,最后返回最大流

复杂度是O(n*m*m)

一些技巧:

1.由于图中可能出现重边,根据复杂度的表达式可以看出重边会增大算法的复杂度,所以我们可以预处理一下给的边权,让其相同边的边权先进行累加最后统一建图

2.建图时我们不仅要建正向边,还要建立反向边,我们可以让正向边和反向边的编号只是2进制中的最低位不同,这样我们就能直接通过编号异或而得到反向边的编号了

3.求解最大流时一开始给定的边中不能具有双向边,如果有双向边,我们可以新加一个节点,使其将双向边变为等价的单向边,例:

给出一道例题:洛谷P3376

题目链接:【模板】网络最大流 - 洛谷

题目:

样例输入:

4 5 4 3
4 2 30
4 3 20
2 3 20
2 1 30
1 3 40

样例输出:

50

细节见代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
using namespace std;
#define int long long
const int N=2e5+10,M=203;
int e[N],ne[N],idx,h[N],w[N],p[M][M];//p数组用来处理重边
int pre[M],mf[M];//pre[i]记录i号节点的前驱边的编号,mf[i]记录第i个节点的最大扩增流量
bool vis[M];
int n,m,s,t;
void add(int x,int y,int z)
{e[idx]=y;w[idx]=z;ne[idx]=h[x];h[x]=idx++;
}
bool bfs()//寻找增广路
{memset(vis,false,sizeof vis);mf[s]=0x3f3f3f3f;//将起点的扩增流量设置为无穷大 queue<int>q;q.push(s);while(!q.empty()){int x=q.front();q.pop();for(int i=h[x];i!=-1;i=ne[i]){int j=e[i];if(!vis[j]&&w[i]){vis[j]=true;mf[j]=min(mf[x],w[i]);//该点的最大扩增流量为扩增路径中所有点的最大限制流量的最小值 pre[j]=i;//记录前驱边的编号q.push(j);if(j==t) return true;}}}return false;
}
int EK()
{int ans=0;while(bfs()){int x=t;while(x!=s){int id=pre[x];w[id]-=mf[t];//减去终点的新增流量w[id^1]+=mf[t];//反向边加上终点的新增流量 x=e[id^1];//反向边的末节点就是x的前驱节点}ans+=mf[t];//答案记录本次增广路新增流量 }return ans;
}
signed main()
{cin>>n>>m>>s>>t;for(int i=1;i<=n;i++) h[i]=-1;for(int i=1;i<=m;i++){int u,v,z;scanf("%lld%lld%lld",&u,&v,&z);p[u][v]+=z;//处理重边 }for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(p[i][j]){add(i,j,p[i][j]);add(j,i,0);//建立反向边 }printf("%lld",EK());return 0;
}

网络流最大流----EK算法相关推荐

  1. 网络流——最大流EK算法讲解

    网络流--最大流EK算法讲解 好了,这是第二篇博客了,如第一篇所述,来讲一讲刚刚理解的网络流.因为本人只会EK算法,所以先讲这个算法.(我会去补知识点的!!!) 什么是网络流??? 读者们刚接触这个知 ...

  2. (通俗易懂小白入门)网络流最大流——EK算法

    网络流 网络流是模仿水流解决生活中类似问题的一种方法策略,来看这么一个问题,有一个自来水厂S,它要向目标T提供水量,从S出发有不确定数量和方向的水管,它可能直接到达T或者经过更多的节点的中转,目前确定 ...

  3. 网络流最大流EK算法板子

    刚刚看了个板子,自己能够理解的也不是太深,但是大体上懂什么意思了. #include<stdio.h> #include<string.h> #include<iostr ...

  4. 网络流问题以及EK算法复杂度分析

    网络流问题以及EK算法复杂度分析 一.网络流算法 通过一个例子引入网络流问题. 现有一个自来水厂要往家里通水,自来水厂用Vs表示,家用Vt表示.从自来水厂到家之间连接了很多水管,并且中途经过很多转接点 ...

  5. 图论 —— 网络流 —— 最大流 —— FF 算法与 EK 算法

    [概述] FF 算法与 EK 算法是求解最大流的一般增广路方法,其时间复杂度均为 O(n*m*m) Ford-Fulkerson 算法是求解最大流的最基础的算法,其核心思想是增广路定理:网络达到最大流 ...

  6. 图论 —— 网络流 —— 最大流 —— Dinic 算法

    [概述] Dinic 算法在 EK 算法的基础上进行了优化,其时间复杂度为 O(n*n*m). Dinic 在找增广路的时也是找最短增广路, 但与 EK 算法不同的是 Dinic 算法并不是每次 bf ...

  7. 图论 —— 网络流 —— 费用流 —— MCMF 算法

    [概述] EK 算法是每次用广搜寻找一条最短的增广路,然后沿其增广,而 MCMF 算法是在 EK 算法的基础上,每次用 SPFA 计算图的距离标号,然后沿着可行边进行增广,即将 EK 算法中的 bfs ...

  8. 网络流最大流 Dinic算法模板

    Dinic算法跟EK算法的优化地方就在于,EK是每次bfs记录前驱结点,然后从汇点找到一条回到源点的路. 而dinic是bfs记录深度,不断从源点dfs到汇点并且更新路径流量,直到dfs不到汇点. 邻 ...

  9. 网络流-最大流(Ford-Fulkerson算法Dinic算法)

    文章目录 最大流 FF算法: 增广路: 反边: 代码: Dinic算法: Dinic + 当前弧优化 最大流 就如同水流,存在一张图,既有起点又有终点,从起点流向终点的最大流量就是最大流. 在上面的图 ...

最新文章

  1. XR应用场景骤变,一场波及5亿人的新探索开始了
  2. 获取请求参数通用方式|| 中文乱码问题||请求转发
  3. 自然语言处理之循环神经网络(五)
  4. 玩转GIT系列之【如何恢复windows系统下git的状态图标显示】
  5. json/ 发送形式_24/7的完整形式是什么?
  6. MVC防止xss攻击 ——Html.AntiForgeryToken的AJAX提交
  7. git Could not read from remote repository.Please make sure you have the correct access rights.
  8. python int函数和二进制、八进制、十进制转换
  9. Vijos P1740聪明的质检员
  10. php 怎么开启错误报告,php错误报告级别怎么设置?
  11. 七、Linux常用命令——网络通信命令、系统关机命令
  12. Linux内核块设备层介绍之bio层
  13. 高中信息技术教资-笔记-存储容量之间的换算关系
  14. 关闭安卓系统导航栏右下角自动旋转按钮
  15. html 插入虾米音乐,虾米音乐导入导出方法
  16. 用ros输出hello,world(c++版)
  17. 【多模态】多模态特征融合策略——门控多模态融合方法
  18. 输入目录路径以及名字,能够将该路径下所有文件的属性打印出来,类似ls -l
  19. FFmpeg音频解码-音频可视化
  20. 降级重新安装低版本flash_player_active_x的方法

热门文章

  1. 游戏推广免费的cps模式和游戏加盟平台选择的一个误区。
  2. php开发cms漏洞,bagecms漏洞复现
  3. OSChina 周一乱弹 —— 这些年经历了不少爱情历险
  4. 使用scikit-image feature计算图像特征与常见特征示例
  5. CocosCreator H5小游戏屏幕适配解决方案
  6. 王爽《汇编语言》实验1笔记与实验任务
  7. Pycharm激活当前虚拟环境本身的安装包空间
  8. 小k java_leetcode——面试题 17.14. 最小K个数 (java快速排序)
  9. VASP出错 PZSTEIN parameter number 4 had an illegal value
  10. 【CSS】CSS选择器优先级及!important属性