20251231 费用流求解线性规划
记号
\(f(u, v)\) 代表 \((u, v)\) 的流量。
\(cap(u, v)\) 代表 \((u, v)\) 的容量。
\(cost(u, v)\) 代表 \((u, v)\) 单位流量流过的费用。
\(b(u)\) 代表每个点流量差距,表示为流出 - 流入。
费用流线性规划形式
线性规划对偶
分别为三种约束引入 \(z(u, v), y(u, v), x(u)\) 三种约束变量(对应定义域为 \(\ge 0\), \(\ge 0\), \(\mathbb{R}\)),可以得到:
优化参数关系
根据 \(x(u) - x(v) + y(u, v) - z(u, v) \ge cost(u, v)\),可知 \(y(u, v)\ge x(v) - x(u) + cost(u, v) + z(u, v)\)。
且在最优化式子中是 \(cap(u, v)y(u, v)\),\(cap(u, v)\ge 0\),所以 \(y(u, v)\) 一定是在 \(\ge 0\) 的情况越小越好,可知 \(y(u, v) = \max(x(v) - x(u) + cost(u, v) + z(u, v), 0)\)。
且发现 \(z(u, v)\) 并不在最优化式子中,为了使 \(y(u, v)\) 最小,\(z(u, v)\) 一定为 \(0\)。
综上,最后化简可以得到:
两者的关系
对于最优化问题,如果形式类似,则可以按照对应的关系建图求解最大费用最大流。
需要注意必须是最大流,因为首先需要满足每个点的流量关系,所以必须要保证流满。
具体来说,建立源点 \(S\) 汇点 \(T\)。
对于 \(b(u) > 0\) 的点,缺少进入的流量,连边 \((S, u, b(u), 0)\)。
对于 \(b(u) < 0\) 的点,缺少流出的流量,连边 \((u, T, -b(u), 0)\)。
对于 \((u, v)\),根据系数连边 \((u, v, cap(u, v), cost(u, v))\)。
Luogu P3337 [ZJOI2013] 防守战线
考虑引入前缀和变量 \(s_i\)。
那么问题变为:
考虑变化一下形式:
对于下方的限制,尝试引入 \(\infty\):
此时令 \(x(u)\) 为 \(s_i\),则有 \(b(u) = c_i - c_{i + 1}\),对应可以连出 \(S, u, T\) 间的连边。
对于第二个 \(\sum\),根据对应关系可以得到 \((i, i - 1, \infty, 0)\)。
对于第三个 \(\sum\),根据对应关系可以得到 \((r_i, l_i - 1, \infty, d_i)\)。
求解最大费用最大流即可,可以把边权取反变为最小费用最后在取反得到答案。
浙公网安备 33010602011771号