定义
每条边都有单位费用 w ( i , j ) w(i,j) w(i,j),设f为N上的一个可行流,称 w ( f ) = ∑ < i , j > ∈ E w ( i , j ) f ( i , j ) w(f) = \sum_{<i,j> ∈ E} w(i,j)f(i,j) w(f)=∑<i,j>∈Ew(i,j)f(i,j) 为f的费用,所有流量为 v 0 v_0 v0的可行流中费用最小的称作流量 v 0 v_0 v0的最小可行流。
辅助网络
负回路算法求最小费用流
- 首先求一个流量为 v 0 v_0 v0的可行流 f f f
- 如果残余网络 N ( f ) N(f) N(f)中存在权aw的负回路C,令$f^{’} ← f + h^{C} $
- 重复进行,直到残余网络中不存在权aw的负回路为止,则f是最小费用流
最短路径与负回路
定理 带权有向图D中任意两点间都有最短路径或不存在路径当且仅当D中不含负回路。
可以用Floyd算法求负回路(如果存在),带上标记函数即可恢复出最短路径(从而找出负权环位置)
负回路算法伪码
最短路径算法
- 从一个初始的最小费用流 f f f(如零流)开始
- 如果 v ( f ) < v 0 v(f) < v_0 v(f)<v0,找一条费用最少的s-t增广链 P P P,修改 P P P上的流量,得到新的可行流 f ′ f^{'} f′
- 重复进行,直到流量等于 v 0 v_0 v0为止
如果存在负回路,用Floyd算法计算最短路径;若不存在负回路,可以用Bellman-Ford算法