最大流EK和Dinic算法

EK算法

最朴素的求最大流的算法。
做法:不停的寻找增广路,直到找不到为止

代码如下:

@Frosero
#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
#define INF 0x3f3f3f3fusing namespace std;
int n,m;
int cap[202][202],flow[202][202],mf[202],pre[202];//cap为网络的容量 flow为现在的流量 //mf[i]为原点到点i的最大流量 pre[i]为增广路上i点上一个点int EK(int s,int t){memset(flow,0,sizeof(flow));queue<int>q;int ans = 0;while(1){while(!q.empty()) q.pop(); q.push(s);memset(mf,0,sizeof(mf));mf[1] = INF;while(!q.empty()){int u = q.front(); q.pop();for(int i=1;i<=m;i++)if(!mf[i] && flow[u][i] < cap[u][i]){pre[i] = u;q.push(i);mf[i] = min(mf[u],cap[u][i] - flow[u][i]);}}if(mf[t] == 0) break;ans += mf[t];for(int i=t;i!=s;i=pre[i]){flow[pre[i]][i] += mf[t];flow[i][pre[i]] -= mf[t];}}return ans;
}int main(){while(scanf("%d %d",&n,&m)!=EOF){memset(cap,0,sizeof(cap));memset(flow,0,sizeof(flow));int u,v,w;while(n--){scanf("%d %d %d",&u,&v,&w);cap[u][v] += w;}printf("%d\n",EK(1,m));}
}

Dinic算法

Dinic的优化部分就是给残留网络生成一个层次图,然后尽量的利用层次图后再形成新的层次图。

理论上Dinic和EK算法的时间复杂度差不多,但是事实上Dinic算法要好得多。

代码如下:

@Frosero
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#define INF 0x3f3f3f3fusing namespace std;int n,m,flow[202][202],cap[202][202];
int dis[202];//flow为现在的流量 cap为网络的容量//dis为点的层次bool bfs(){                 //形成层次图memset(dis,-1,sizeof(dis));dis[1] = 0;queue<int>q; q.push(1);while(!q.empty()){int u = q.front(); q.pop();for(int i=1;i<=m;i++)if(dis[i] == -1 && flow[u][i] < cap[u][i]){dis[i] = dis[u] + 1;q.push(i);}}if(dis[m] == -1) return false;else return true;
}int dfs(int s = 1,int f = INF){     //利用层次图不断寻找增广路if(s == m || f == 0) return f;int ans = 0;for(int i=1;i<=m;i++)if(dis[i] == dis[s] + 1){int a = dfs(i,min(f,cap[s][i] - flow[s][i]));if(a == 0) continue;flow[s][i] += a;flow[i][s] -= a;ans += a;f -= a;if(f <= 0) break;}return ans;
}int dinic(){                //Dinic主过程int ans = 0;while(bfs()){ans += dfs();}return ans;
}int main(){while(scanf("%d %d",&n,&m)!=EOF){   //本代码假设1为原点 m为汇点memset(flow,0,sizeof(flow));memset(cap,0,sizeof(cap));int u,v,w;while(n--){scanf("%d %d %d",&u,&v,&w);cap[u][v] += w;}printf("%d\n",dinic());}return 0;
}

转载于:https://www.cnblogs.com/ScratchingBear/p/5345837.html

最大流EK和Dinic算法相关推荐

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

    最大流算法模板:EK和dinic算法 一.EK算法模板 #include<iostream> #include<queue> using namespace std; cons ...

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

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

  3. 网络流之最大流 EK/Dinic/Isap算法 学习笔记

    EK 算法流程 不停地找增广路进行增广,知道找不到增广路为止. 每一次bfs只找一条增广路. 时间复杂度O(VE2)O(VE^2) 代码 // codevs 1993 #include<iost ...

  4. 网络流初步最大流(EK算法和Dinic算法进阶)

    网络流最大流(network_flows) 网络流是一种类比水流的解决问题的方法,首先我们要明白它解决的是什么样的问题. 比如说最基本的,从水厂通过各种水管到达你家的能有多少水量,每个水管有自己的流量 ...

  5. Dinic算法----最大流常用算法之一

    --没有什么是一个BFS或一个DFS解决不了的:如果有,那就两个一起. 最大流的$EK$算法虽然简单,但时间复杂度是$O(nm^2)$,在竞赛中不太常用. 竞赛中常用的$Dinic$算法和$SAP$, ...

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

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

  7. 最大流之Dinic算法

    Dinic是一个分层的增广路算法. Dinic中分层的概念定义为:到原结点的最小距离相同的点为同一层. 假设有拓扑如下:如果源点为1,宿点为4:拓扑可以分成4层. 首先,回想E-K算法是怎么算的:使用 ...

  8. dinic算法 c 语言,网络流入门—用于最大流的Dinic算法

    "网络流博大精深"-sideman语 一个基本的网络流问题 最早知道网络流的内容便是最大流问题,最大流问题很好理解: 解释一定要通俗! 如右图所示,有一个管道系统,节点{1,2,3 ...

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

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

最新文章

  1. 开启Android Q DarkMode | 开启Android Q深色模式 夜间模式
  2. ceph存储原理_【理论研究】漫谈传统IT基础设施10-存储(04)
  3. TCP,IP,HTTP,SOCKET区别和联系
  4. 美国正面临“人才泡沫”破裂危机?
  5. [CQOI2017]小Q的棋盘
  6. 计算机网络「二」—— 物理层(多图详解)
  7. 微信看一看强化学习推荐模型的知识蒸馏探索之路丨CIKM 2021
  8. [USACO4.1]麦香牛块Beef McNuggets By cellur925
  9. 添加用户到sudoers
  10. PCA计算点云的法线
  11. 发光二极管pcb封装图画法_【AD封装】贴片及插件二极管整流桥(带3D)
  12. 分享舍得网开发经验(修改版)(转载)
  13. TabLayout的Indicator自定义宽度
  14. npm install 报错 gyp info it worked if it ends with ok
  15. JVAV中常见的十大异常
  16. IDEA2022 提示:更新 TKK 失败,请检查网络连接
  17. 查询mysql的版本
  18. 猿创征文|浅谈区块链-区块链是什么?
  19. css nth-child_比较CSS伪类:nth-​​child与nth-of-type
  20. 花生wifi后台管理系统项目日记

热门文章

  1. python有道自动翻译_利用python写一个有道翻译的脚本
  2. 完全二叉树基本操作(不含遍历)
  3. 电路中滤波电容和退耦电容_详解电源滤波电路中的高频滤波电容电路
  4. java 2_Java(二)
  5. oracle 11g release2版本jdbc,Oracle发布JDeveloper11gRelease2更新版
  6. php右侧弹窗QQ客服,JavaScript_网页右侧悬浮滚动在线qq客服代码示例,网页右侧悬浮滚动QQ在线客服 - phpStudy...
  7. AndroidStudio cmakelist找不到问题
  8. 什么是E1接口,E1的使用注意事项
  9. POE以太网交换机产品优势介绍
  10. 【渝粤教育】21秋期末考试计量经济学10551k1