【模板】EK求最大流、dinic求最大流
ACM模板
目录
- 概念
- EK算法
- Dinic算法
概念
yxc老师的部分总结
- 基本概念
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求最大流相关推荐
- 网络流-Dinic求最大流(仅做自己复习,写的很不清楚)
网络流-Dinic求最大流 2021.8.18 原理:网络流-EK求最大流 在Dinic求最大流中,d数组变成了步数的记录,pre数组变成了对其上一条路径的记录. bool bfs() {queue& ...
- 最大流算法模板:EK和dinic算法
最大流算法模板:EK和dinic算法 一.EK算法模板 #include<iostream> #include<queue> using namespace std; cons ...
- Uvaoj 11248 Frequency Hopping(Dinic求最小割)
题意:1到n节点(节点之间有一定的容量),需要流过C的流量,问是否可以?如果可以输出possible, 否则如果可以扩大任意一条边的容量 可以达到目的,那么输出possible option:接着输出 ...
- luogu P4512 多项式除法 (模板题、FFT、多项式求逆)
luogu P4512 多项式除法 (模板题.FFT.多项式求逆) 手动博客搬家: 本文发表于20181206 14:42:53, 原地址https://blog.csdn.net/suncongbo ...
- luogu P4725 多项式对数函数 (模板题、FFT、多项式求逆、求导和积分)
luogu P4725 多项式对数函数 (模板题.FFT.多项式求逆.求导和积分) 手动博客搬家: 本文发表于20181125 13:25:03, 原地址https://blog.csdn.net/s ...
- 【模板】最大流之上下界可行流
ACM模板 目录 无源汇上下界可行流 有源汇上下界最大流 有源汇上下界最小流 无源汇上下界可行流 问题: 给定一个网络,求一个流满足:每条边的流量处在给定的下界和上届[lower,upper]之间,满 ...
- Algorithm:C++/python语言实现之求旋转数组最小值、求零子数组、求最长公共子序列和最长公共子串、求LCS与字符串编辑距离
Algorithm:C++/python语言实现之求旋转数组最小值.求零子数组.求最长公共子序列和最长公共子串.求LCS与字符串编辑距离 目录 一.求旋转数组最小值 1.分析问题 2.解决思路 二.求 ...
- 【运筹学】运输规划求最大值 ( 运输规划求最大值问题示例 | 转为运输规划求最小值的方式 )
文章目录 一.运输规划求最大值问题 二.运输规划求最大值问题示例 一.运输规划求最大值问题 目标函数求最大值 : 如求利润最大值 , 营业额最大值 ; maxZ=∑i=1m∑j=1ncijxijs.t ...
- c语言编程矩阵主对角线相同,急求!c语言 求N*N矩阵中主对角线和次对角线的元素之和...
急求!c语言 求N*N矩阵中主对角线和次对角线的元素之和 來源:互聯網 2010-02-24 23:29:06 評論 分類: 電腦/網絡 >> 程序設計 >> 其他編程語言 ...
最新文章
- 如何提高企业竞争力,科学的组织架构是第一王牌
- Python 程序开发90个注意事项
- cmos全局曝光算法_2019腾讯广告算法大赛方案分享(冠军)
- js和jQuery 获取屏幕高度、宽度
- [CQOI2017]小Q的棋盘
- redis在php中的应用(string篇)
- python第九十一天----第十六周作业
- 计算机辅助设计与图像学学报 改后发表,几种常见图像二值化方法的结果对比与分析...
- JSK-10926 各位数字之和的和【入门】
- vue父子组件间传值(props)
- 获取.jar文件运行时所处的路径
- AppCan移动平台,开发者是这样用的……
- wallys/IPQ8074a/2x(4×4 or 8×8) 11AX MU-MIMO DUAL CONCURRENT EMBEDDEDBOARD
- java在线学习系统、基于javaweb的线上智能教育、ssm实现web版本学生在线学习考试、题库管理系统
- 小学-知识与能力【5】
- 手机图片怎么转文本?
- note error - REPT H28PLOG0 not exist create it()
- Android手写签名 附带背景图设置
- Dremel made simple with Parquet (Parquet 原理分析)
- DOS命令——calcs和icacls
热门文章
- java swing 示例_JAVA简单Swing图形界面应用演示样例
- 计算机安全模型研究与应用,软件哨兵安全动态检测模型的研究与实现-计算机应用研究.PDF...
- egg前面加什么_国威说阀:阀门前面为什么加国标美标日标之类的?
- matlab常用函数辨析
- [mybatis]Configuration XML_databaseidProvider
- C++实现各种排序以及复杂度,稳定性分析
- C++实现AOE网中的关键路径算法(邻接表存储)
- [C++11]指针空值类型nullptr
- [C++11]字符串原始字面量
- springboot超详细教程_CG原画插画教程:超详细线稿教程