Primal-Dual 原始对偶算法学习笔记
Primal-Dual 原始对偶算法
Primal-Dual 原始对偶算法能够在较优的时间复杂度内求解最小费用最大流。
参考 Johnson 全源最短路算法的思想,我们为每个点设置一个势能
那么我们只需要满足约束
那么我们每次增广时就可以用 Dijkstra 算法找到源点到汇点的最短路径,取出其上的瓶颈边并增广即可。
但是增广一次后原图的形态会发生改变,具体的,增广路上的边将会变为原来的反向边,同时边权取反。设
- 对于增广路上的边
(i,j,w) ,有d_i+(w+h_i-h_j)=d_j ,即w+(h_i+d_i)-(h_j+d_j)=-w+(h_j+d_j)-(h_i+d_i)=0 ,原边和反向边边权都非负; - 对于不在增广路上的边
(i,j,w) 也是类似,有d_i+(w+h_i-h_j)\ge d_j ,即w+(h_i+d_i)-(h_j+d_j)\ge 0 ,同样非负。
综上,我们可以直接将残量网络上一个点
于是我们就可以用 Dijkstra 来求残量网络中的最短路了。