最小费用最大流,指在保证最大流量的同时最小费用。
网络流系列文章
概念
费用
我们定义一条边的费用 $w(u,v)$ 表示边 $(u,v)$ 上单位流量的费用。也就是说,当边 $(u,v)$ 的流量为 $f(u,v)$ 时,需要花费 $f(u,v)\times w(u,v)$ 的费用。
最小费用最大流
网络流图中,花费最小的最大流被称为最小费用最大流,这也是接下来我们要研究的对象。
求解
我们可以在 $\text{Dinic}$ 算法的基础上进行改进,把 $\text{BFS}$ 求分层图改为用 $\text{SPFA}$(由于有负权边,所以不能直接用 $\text{Dijkstra}$)来求一条单位费用之和最小的路径,也就是把 $w(u,v)$ 当做边权然后在残量网络上求最短路,当然在 $\text{DFS}$ 中也要略作修改。这样就可以求得网络流图的最小费用最大流了。
如何建反向边?对于一条边 $(u,v,w,c)$(其中 $w$ 和 $c$ 分别为容量和费用),我们建立正向边 $(u,v,w,c)$ 和反向边 $(v,u,0,-c)$(其中 $-c$ 是使得从反向边经过时退回原来的费用)。
优化:如果你是“关于 $\text{SPFA}$,它死了”言论的追随者,那么你可以使用 $\text{Primal-Dual}$ 原始对偶算法将 $\text{SPFA}$ 改成 $\text{Dijkstra}$!
时间复杂度:可以证明上界为 $O(nmf)$,其中 $f$ 表示流量。
代码
1 |
|
习题
网络流 24 题
- 「Luogu 1251」餐巾计划问题
- 「Luogu 2754」家园
- 「Luogu 2756」飞行员配对方案问题
- 「Luogu 2761」软件补丁问题
- 「Luogu 2762」太空飞行计划问题
- 「Luogu 2763」试题库问题
- 「Luogu 2764」最小路径覆盖问题
- 「Luogu 2765」魔术球问题
- 「Luogu 2766」最长不下降子序列问题
- 「Luogu 2770」航空路线问题
- 「Luogu 2774」方格取数问题
- 「Luogu 2775」机器人路径规划问题
- 「Luogu 3254」圆桌问题
- 「Luogu 3355」骑士共存问题
- 「Luogu 3356」火星探险问题
- 「Luogu 3357」最长k可重线段集问题
- 「Luogu 3358」最长k可重区间集问题
- 「Luogu 4009」汽车加油行驶问题
- 「Luogu 4011」孤岛营救问题
- 「Luogu 4012」深海机器人问题
- 「Luogu 4013」数字梯形问题
- 「Luogu 4014」分配问题
- 「Luogu 4015」运输问题
- 「Luogu 4016」负载平衡问题