费用流 学习笔记
在看这篇笔记前请先看 网络流简介 这篇的定义部分
费用流
给定一个网络
当
则该网络中总花费最小的最大流称为 最小费用最大流,即在最大化
SSP 算法
SSP(Successive Shortest Path)算法是一个贪心的算法。它的思路是每次寻找单位费用最小的增广路进行增广,直到图上不存在增广路为止。
如果图上存在单位费用为负的圈,SSP 算法无法正确求出该网络的最小费用最大流。此时需要先使用消圈算法消去图上的负圈。
证明
我们考虑使用数学归纳法和反证法来证明 SSP 算法的正确性。
设流量为
假设用 SSP 算法求出的
假设存在更小的
这时候矛盾就出现了:既然存在一条经过至少一个负圈的增广路,那么
综上,SSP 算法可以正确求出无负圈网络的最小费用最大流。
时间复杂度
如果使用 Bellman–Ford 算法 求解最短路,每次找增广路的时间复杂度为
NOTE
为什么 SSP 算法是伪多项式时间的?
SSP 算法的时间复杂度有
可以构造
实现
只需将 EK 算法或 Dinic 算法中找增广路的过程,替换为用最短路算法寻找单位费用最小的增广路即可。
Primal-Dual 原始对偶算法
用 Bellman–Ford 求解最短路的时间复杂度为
Primal-Dual 原始对偶算法的思路与 Johnson 全源最短路径算法 类似,通过为每个点设置一个势能,将网络上所有边的费用(下面简称为边权)全部变为非负值,从而可以应用 Dijkstra 算法找出网络上单位费用最小的增广路。
首先跑一次最短路,求出源点到每个点的最短距离(也是该点的初始势能)
可以发现,这样设置势能后新网络上的最短路径和原网络上的最短路径一定对应。证明在介绍 Johnson 算法时已经给出,这里不再展开。
与常规的最短路问题不同的是,每次增广后图的形态会发生变化,这种情况下各点的势能需要更新。
如何更新呢?先给出结论,设增广后从源点到
容易发现,在一轮增广后,由于一些
而对于原有的边,在增广前,
综上,增广后所有边的边权均非负,使用 Dijkstra 算法可以正确求出图上的最短路。