图论-网络流⑥-费用流
上一篇:图论-网络流⑤-最大流解题②
下一篇:图论-网络流⑦-费用流解题
参考文献:
https://www.cnblogs.com/finder-iot/p/8409010.html
https://blog.csdn.net/Frocean/article/details/81543757
大纲
- 什么是网络流
- 最大流(最小割)
- D i n i c Dinic Dinic (常用)
- E K EK EK
- S a p Sap Sap
- F o r d − F u l k e r s o n Ford-Fulkerson Ford−Fulkerson(不讲)
- H L P P HLPP HLPP (快)
- 最大流解题
- 费用流 Start \color{#33cc00}\texttt{Start} Start
- E K EK EK 费用流
- D i n i c Dinic Dinic 费用流
- z k w zkw zkw 费用流 End \color{red}\texttt{End} End
费用流解题
有上下界的网络流
- 无源汇上下界可行流
- 有源汇上下界可行流
- 有源汇上下界最大流
- 有源汇上下界最小流
- 最大权闭合子图
- 有上下界的网络流解题
上篇讲完了网络最大流的解题,如果你去找个题库刷刷,你会发现网络最大流根本不能满足我们的解题需要。面对更为复杂的情况,需要这一篇的主角出场——网络费用流。
费用流
首先讲讲费用流图。这种网络流图每条边比普通的网络流图多一个限制,就是 c o s t cost cost,表示这条边上每走过 1 1 1 流量就要付费 c o s t cost cost。 如下:
最小费用最大流(就是俗称的费用流),就是求在最大流的情况下的最小费用。如上图的最大流为 1 1 1 ,当流量走 s → 1 → 2 → t s\to1\to2\to t s→1→2→t 时达到最小费用最大流,此时的费用为 3 3 3。
费用流算法
常见的算法是 E K EK EK、 D i n i c Dinic Dinic和zkw费用流。有些时候我们需要的是最大费用最大流,只需要对代码稍作转化即可。
EK费用流
大部分同求最大流的 E K EK EK,算法框架长这样:
int bfs(){
//找到一条增广路
}
int EK(){
//对找到的增广路进行一系列处理
}
因为最大流的一条支流肯定是处处流量相等的,所以一条支流的费用就为 流量 f × f\times f×一路费用和。可以证明,如果把一条边的费用看作边的长度,不停找最短路增广最大流的费用是最小的。
实现: 把原来最大流 E K EK EK的 D f s Dfs Dfs 变成最短路算法(你可以写 D i j + h e a p Dij+heap Dij+heap、 B e l l Bell Bell、 S p f a Spfa Spfa 或 S p f a + S L F Spfa+SLF Spfa+SLF