ACM模板


目录

  • 概念
  • EK算法
  • Dinic算法

概念

yxc老师的部分总结

  1. 基本概念
    1.1 流网络,不考虑反向边
    1.2 可行流,不考虑反向边
    1.2.1 两个条件:容量限制、流量守恒
    1.2.2 可行流的流量指从源点流出的流量 - 流入源点的流量
    1.2.3 最大流是指最大可行流
    1.3 残留网络,考虑反向边,残留网络的可行流f’ + 原图的可行流f = 原题的另一个可行流
    1.4 增广路径
    1.5 割
    1.5.1 割的定义
    1.5.2 割的容量,不考虑反向边,“最小割”是指容量最小的割。
    1.5.3 割的流量,考虑反向边,f(S, T) <= c(S, T)
    1.5.4 对于任意可行流f,任意割[S, T],|f| = f(S, T)
    1.5.5 对于任意可行流f,任意割[S, T],|f| <= c(S, T)
    1.5.6 最大流最小割定理
    (1) 流f是最大流
    (2) 流f的残留网络中不存在增广路
    (3) 存在某个割[S, T],|f| = c(S, T)
    1.6. 算法
    1.6.1 EK O(nm^2)
    1.6.2 Dinic O(n^2m)
    1.7 应用
    1.7.1 二分图
    (1) 二分图匹配
    (2) 二分图多重匹配
    1.7.2 上下界网络流
    (1) 无源汇上下界可行流
    (2) 有源汇上下界最大流
    (3) 有源汇上下界最小流
    1.7.3 多源汇最大流

EK算法

链式前向星初始化-1版本 0正边 1反边
S源点 T汇点
d[]流量 pre[]前向边

存图存的是残留网络
时间复杂度:O(nm2)O(nm^2)O(nm2)

constexpr int N=1010,M=20010;
int h[N],e[M],ne[M],f[M],idx;
int n,m;
int S,T,flow[N],pre[N];
bool st[N];
void add(int a,int b,int c)
{e[idx]=b,f[idx]=c,ne[idx]=h[a],h[a]=idx++;e[idx]=a,f[idx]=0,ne[idx]=h[b],h[b]=idx++;
}
bool bfs()
{queue<int> q;memset(flow,0x3f,sizeof flow);memset(st,0,sizeof st);q.push(S);st[S]=1;while(q.size()){int u=q.front();q.pop();for(int i=h[u];i!=-1;i=ne[i]){int v=e[i];if(f[i]&&!st[v]){st[v]=1;flow[v]=min(flow[u],f[i]);pre[v]=i;if(v==T) return 1;q.push(v);}}}return 0;
}
int EK()
{int ans=0;while(bfs()){ans+=flow[T];for(int i=T;i!=S;i=e[pre[i]^1]){f[pre[i]]-=flow[T];f[pre[i]^1]+=flow[T];}}return ans;
}

Dinic算法

模拟队列
时间复杂度:O(n2m)O(n^2m)O(n2m)

int h[N],e[M],ne[M],f[M],idx;
int S,T,d[N],q[N],cur[N];
void add(int a,int b,int c)
{e[idx]=b,ne[idx]=h[a],f[idx]=c,h[a]=idx++;e[idx]=a,ne[idx]=h[b],f[idx]=0,h[b]=idx++;
}
bool bfs()
{memset(d,-1,sizeof d);int hh=0,tt=0;d[S]=0,cur[S]=h[S],q[0]=S;while(hh<=tt){int u=q[hh++];for(int i=h[u];i!=-1;i=ne[i]){int v=e[i];if(d[v]==-1&&f[i]){d[v]=d[u]+1;cur[v]=h[v];// 当前弧优化if(v==T) return 1;q[++tt]=v;}}}return 0;
}
int dfs(int u=S,int flow=0x3f3f3f3f)
{if(u==T) return flow;int rmn=flow;for(int &i=cur[u];i!=-1&&rmn;i=ne[i]){int v=e[i];if(d[v]==d[u]+1&&f[i]){int t=dfs(v,min(f[i],rmn));if(!t) d[v]=-1;// 优化f[i]-=t,f[i^1]+=t,rmn-=t;}}return flow-rmn;
}
int dinic()
{int r=0;while(bfs()) r+=dfs();return r;
}

【模板】EK求最大流、dinic求最大流相关推荐

  1. 网络流-Dinic求最大流(仅做自己复习,写的很不清楚)

    网络流-Dinic求最大流 2021.8.18 原理:网络流-EK求最大流 在Dinic求最大流中,d数组变成了步数的记录,pre数组变成了对其上一条路径的记录. bool bfs() {queue& ...

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

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

  3. Uvaoj 11248 Frequency Hopping(Dinic求最小割)

    题意:1到n节点(节点之间有一定的容量),需要流过C的流量,问是否可以?如果可以输出possible, 否则如果可以扩大任意一条边的容量 可以达到目的,那么输出possible option:接着输出 ...

  4. luogu P4512 多项式除法 (模板题、FFT、多项式求逆)

    luogu P4512 多项式除法 (模板题.FFT.多项式求逆) 手动博客搬家: 本文发表于20181206 14:42:53, 原地址https://blog.csdn.net/suncongbo ...

  5. luogu P4725 多项式对数函数 (模板题、FFT、多项式求逆、求导和积分)

    luogu P4725 多项式对数函数 (模板题.FFT.多项式求逆.求导和积分) 手动博客搬家: 本文发表于20181125 13:25:03, 原地址https://blog.csdn.net/s ...

  6. 【模板】最大流之上下界可行流

    ACM模板 目录 无源汇上下界可行流 有源汇上下界最大流 有源汇上下界最小流 无源汇上下界可行流 问题: 给定一个网络,求一个流满足:每条边的流量处在给定的下界和上届[lower,upper]之间,满 ...

  7. Algorithm:C++/python语言实现之求旋转数组最小值、求零子数组、求最长公共子序列和最长公共子串、求LCS与字符串编辑距离

    Algorithm:C++/python语言实现之求旋转数组最小值.求零子数组.求最长公共子序列和最长公共子串.求LCS与字符串编辑距离 目录 一.求旋转数组最小值 1.分析问题 2.解决思路 二.求 ...

  8. 【运筹学】运输规划求最大值 ( 运输规划求最大值问题示例 | 转为运输规划求最小值的方式 )

    文章目录 一.运输规划求最大值问题 二.运输规划求最大值问题示例 一.运输规划求最大值问题 目标函数求最大值 : 如求利润最大值 , 营业额最大值 ; maxZ=∑i=1m∑j=1ncijxijs.t ...

  9. c语言编程矩阵主对角线相同,急求!c语言 求N*N矩阵中主对角线和次对角线的元素之和...

    急求!c语言 求N*N矩阵中主对角线和次对角线的元素之和 來源:互聯網  2010-02-24 23:29:06  評論 分類: 電腦/網絡 >> 程序設計 >> 其他編程語言 ...

最新文章

  1. 如何提高企业竞争力,科学的组织架构是第一王牌
  2. Python 程序开发90个注意事项
  3. cmos全局曝光算法_2019腾讯广告算法大赛方案分享(冠军)
  4. js和jQuery 获取屏幕高度、宽度
  5. [CQOI2017]小Q的棋盘
  6. redis在php中的应用(string篇)
  7. python第九十一天----第十六周作业
  8. 计算机辅助设计与图像学学报 改后发表,几种常见图像二值化方法的结果对比与分析...
  9. JSK-10926 各位数字之和的和【入门】
  10. vue父子组件间传值(props)
  11. 获取.jar文件运行时所处的路径
  12. AppCan移动平台,开发者是这样用的……
  13. wallys/IPQ8074a/2x(4×4 or 8×8) 11AX MU-MIMO DUAL CONCURRENT EMBEDDEDBOARD
  14. java在线学习系统、基于javaweb的线上智能教育、ssm实现web版本学生在线学习考试、题库管理系统
  15. 小学-知识与能力【5】
  16. 手机图片怎么转文本?
  17. note error - REPT H28PLOG0 not exist create it()
  18. Android手写签名 附带背景图设置
  19. Dremel made simple with Parquet (Parquet 原理分析)
  20. DOS命令——calcs和icacls

热门文章

  1. java swing 示例_JAVA简单Swing图形界面应用演示样例
  2. 计算机安全模型研究与应用,软件哨兵安全动态检测模型的研究与实现-计算机应用研究.PDF...
  3. egg前面加什么_国威说阀:阀门前面为什么加国标美标日标之类的?
  4. matlab常用函数辨析
  5. [mybatis]Configuration XML_databaseidProvider
  6. C++实现各种排序以及复杂度,稳定性分析
  7. C++实现AOE网中的关键路径算法(邻接表存储)
  8. [C++11]指针空值类型nullptr
  9. [C++11]字符串原始字面量
  10. springboot超详细教程_CG原画插画教程:超详细线稿教程