最大流算法模板:EK和dinic算法

一、EK算法模板

#include<iostream>
#include<queue>
using namespace std;
const int maxn=205;
const int inf=0x7fffffff;
//图
int r[maxn][maxn];
//被访问点为true否则为false
bool visit[maxn];
//pre[i] = j i点之前的点为j点
int pre[maxn];
int m,n;bool bfs(int s,int t) //寻找一条从s到t的增广路,若找到返回true
{int p;queue<int > q;memset(pre,-1,sizeof(pre));memset(visit,false,sizeof(visit));pre[s]=s;visit[s]=true;q.push(s);while(!q.empty()){p=q.front();q.pop();for(int i=1;i<=n;i++){if(r[p][i]>0 && !visit[i]){pre[i]=p;visit[i]=true;if(i==t) return true;q.push(i);}}}return false;
}int EdmondsKarp(int s,int t)
{int flow=0,d,i;//直到一条增广路也找不到就退出while(bfs(s,t)){d = inf;//遍历找出当前增广路的最小流量for(i=t;i!=s;i=pre[i])d = r[pre[i]][i] > d? d:r[pre[i]][i];for(i=t;i!=s;i=pre[i]){//减小正向边的流量r[pre[i]][i] -=d;//同时增加反向边的流量r[i][pre[i]] +=d;}flow+=d;}return flow;
}int main()
{while(scanf("%d%d",&m,&n)!=EOF){int u,v,w;memset(r,0,sizeof(r));///for(int i=0;i<m;i++){scanf("%d%d%d",&u,&v,&w);r[u][v]+=w;}printf("%d\n",EdmondsKarp(1,n));}return 0;
}

二.dinic算法模板

这篇博客写的很好有图有注释
https://www.cnblogs.com/SYCstudio/p/7260613.html
int s,t;//源点和汇点
int cnt;//边的数量,从0开始编号。
int Head[maxN];//每一个点最后一条边的编号
int Next[maxM];//指向对应点的前一条边
int V[maxM];//每一条边指向的点
int W[maxM];//每一条边的残量
int Depth[maxN];//分层图中标记深度
int Dinic()
{int Ans=0;//记录最大流量while (bfs()){while (int d=dfs(s,inf))Ans+=d;}return Ans;
}
bool bfs()
{queue<int> Q;//定义一个bfs寻找分层图时的队列while (!Q.empty())Q.pop();memset(Depth,0,sizeof(Depth));Depth[s]=1;//源点深度为1Q.push(s);do{int u=Q.front();Q.pop();for (int i=Head[u];i!=-1;i=Next[i])if ((W[i]>0)&&(Depth[V[i]]==0))//若该残量不为0,且V[i]还未分配深度,则给其分配深度并放入队列{Depth[V[i]]=Depth[u]+1;Q.push(V[i]);}}while (!Q.empty());if (Depth[t]==0)//当汇点的深度不存在时,说明不存在分层图,同时也说明不存在增广路return 0;return 1;
}
int dfs(int u,int dist)//u是当前节点,dist是当前流量
{if (u==t)//当已经到达汇点,直接返回return dist;for (int i=Head[u];i!=-1;i=Next[i]){if ((Depth[V[i]]==Depth[u]+1)&&(W[i]!=0))//注意这里要满足分层图和残量不为0两个条件{int di=dfs(V[i],min(dist,W[i]));//向下增广if (di>0)//若增广成功{//为什么异或1 举个例子:输入第一条边编号为0,反向边编号为1,0 ^ 1 = 1, 1 ^ 1 = 0,可以看出进行异或1操作后可以马上得出当前边的反向边,这算是一个小技巧W[i] -= di;//正向边减W[i^1] += di;//反向边加return di;//向上传递}}}return 0;//否则说明没有增广路,返回0
}

总结

EK算法的时间复杂度为O(m*m*n),dinic算法的时间复杂度为(n*n*m),其中m代表边数,n代表顶点数。由此可见对于稠密图来说dinic算法更加高效,当然dinic算法还有可以优化的地方,例如当前弧优化,读者可自行查阅资料。

最大流算法模板:EK和dinic算法相关推荐

  1. 最大流EK和Dinic算法

    最大流EK和Dinic算法 EK算法 最朴素的求最大流的算法. 做法:不停的寻找增广路,直到找不到为止 代码如下: @Frosero #include <cstdio> #include ...

  2. c语言编程算法模板,C语言编程算法精选.doc

    C语言编程算法精选 二级C语言编程算法精选一.数学计算1.编写函数double?fun功能是:根据公式计算s,计算结果通过形参指针sn传回:n通过形参传入.? ? 1? ?? ?1? ?? ? 1? ...

  3. 【网络流】最大流问题(EK算法带模板,Dinic算法带模板及弧优化,ISAP算法带模板及弧优化)上下界网络流

    本blog重点是代码 网络流的相关概念 流网络(flow network) 流(flow) 网络的流 残留网络(residual network) 增广路径(augmenting path) Edmo ...

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

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

  5. Dinic算法寻找网络最大流的Java实现

    1.代码实现 package Graph;import java.util.ArrayList; import java.util.Collections; import java.util.Hash ...

  6. 图论 —— 网络流 —— 最大流 —— 压入与重标记算法

    [概述] 压入与重标记算法(Push-Relable Algorithms)又称预留推进算法,是 GoldBerg 与 Tarjan 共同发现的,时间复杂度为 O(V*V*E) 该算法与 EK .Di ...

  7. nyoj-239 月老的难题 (二分图匹配—匈牙利算法 网络流—Dinic算法)

    月老的难题 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 月老准备给n个女孩与n个男孩牵红线,成就一对对美好的姻缘. 现在,由于一些原因,部分男孩与女孩可能结成幸福的一 ...

  8. Dinic算法(C语言)

    网络最大流---Dinic 前言 介绍 网络流 剩余网络 最大流最小割定理 Dinic算法步骤 代码 前言 新手第一次写博客,刚好这几天学习了一个新算法Dinic算法,就拿它练手吧,多多包涵. 介绍 ...

  9. Linux加密框架 crypto算法模板 以及CBC算法模板实例

    参考链接 Linux加密框架中的主要数据结构(四)_家有一希的博客-CSDN博客 algapi.h - include/crypto/algapi.h - Linux source code (v5. ...

最新文章

  1. 【jquery】一款不错的音频播放器——Amazing Audio Player
  2. GET请求中URL的最大长度限制总结
  3. 斐波那契数列快速算法详解
  4. [css] 如何让大小不同的图片等比缩放不变形显示在固定大小的div里?写个例子
  5. 历时两年,微软物联网安全服务 Azure Sphere 全面上线!
  6. 自反馈与 Mandelbrot set
  7. spring - ioc和aop
  8. Hadoop-2.0命令手册
  9. win7共享xp打印机_打印机共享那些事儿……
  10. BASIC-9 特殊回文数 C语言版
  11. wx_xcx_api.php,GitHub - biangbiang/wxpay-php: php项目基于微信支付JS SDK和JS API的接入开发...
  12. oraoledb.oracle.11,Oracle11g链接提示未“在本地计算机注册“OraOLEDB.Oracle”解决方法...
  13. html鼠标手状态,css html 鼠标手型,鼠标形状,鼠标效果,样式
  14. 德州仪器TI芯片自动下单抢购监控软件技术分析
  15. android系统关机广播,android关机方法汇总
  16. chmod 命令详细用法
  17. 数据库生成日然周、自然月、自然日
  18. java基础做简单的医院管理系统,附带课程设计说明书
  19. 安装oracle11g数据库
  20. 世界最牛实验室,堪称诺贝尔奖孵化器!到底是个怎样神奇的存在?!

热门文章

  1. v8漏洞任意地址读写(CVE-2021-21220)
  2. 服务器系统进不了路由器,Win7输入192.168.0.1打不开路由器管理界面的解决方法
  3. 企业如何实现IoT物联网远程控制
  4. 玩游戏计算机配置,玩大型游戏需要什么配置
  5. 叉乘点乘混合运算公式_人教版小学二年级数学概念、公式汇总(附应用题),开学前给孩子预习!...
  6. 10大常见反人类设计:产品经理你的良心不会痛吗
  7. any在mysql语句中用法,MySQL中,子查询中可以使用运算符ANY,它表示的意思是______。...
  8. 18650测试 微型计算机,至轻至薄 四款超轻薄移动电源测试
  9. iPhone游戏开发:使用到的工具和技术
  10. Hudson之——持续集成服务器的安装与配置