zoukankan      html  css  js  c++  java
  • 「学习笔记」线性规划 / 网络流

    对偶问题

    [max { c^intercal x mid A x leq b } = min { b^intercal y mid A^intercal y geq c } ]

    来道例题:

    洛谷P3337 [ZJOI2013]防守战线

    列出式子:

    [egin{aligned} & mathrm{minimize} sum_i c_i y_i \ & s.t. forall i in [1, n], sum_{l_i leq j leq r_i} y_j geq d_i \ & forall i in [1, n], y_i geq 0 end{aligned} ]

    (A^intercal_{i,j} = [j in [l_i, r_i]])(b = egin{bmatrix} c_1 \ c_2 \ vdots \ c_n end{bmatrix})(c =egin{bmatrix} d_1 \ d_2 \ vdots \ d_n end{bmatrix}),于是对偶之后为:

    [egin{aligned} & mathrm{maximize} sum_i d_i x_i \ & s.t. forall i in [1, n], sum_{j} A_{i, j} x_j geq c_i \ & forall i in [1, n], x_i geq 0 end{aligned} ]

    同时 (A) 的列中有连续的 (1) 出现。

    感觉很不错,于是加上松弛变量:

    [sum_{j} A_{i,j} x_j + y_i = c_i ]

    差分后:

    [sum_{l_j = i} x_j - sum_{r_j + 1 = i} x_j + y_i - y_{i - 1} = c_i - c_{i - 1} ]

    移项得到:

    [sum_{l_j = i} x_j + c_{i - 1} + y_i = sum_{r_j + 1 = i} x_j + c_i + y_{i - 1} ]

    将等式看成一个点的流量平衡,于是就有这样的连边方案:

    • 点集 (V = {S, T, 1, 2, cdots, n + 1})

    • (forall i in [1, n + 1]),连边 ((S, i, c_{i - 1}, 0))(即从 (S)(i),流量为 (c_{i - 1}),费用为 (0))和 ((i, T, c_i, 0))

    • (forall i in [1, n]),连边 ((i + 1, i, infty, 0)) 表示松弛变量。

    • 对任意区间 ([l_i, r_i]),连边 ((r_i + 1, l_i, infty, d_i))

    于是上最大费用最大流即可,具体实现细节可以见代码


    未完待续。。。

  • 相关阅读:
    IE8 "开发人员工具" 无法使用,无法显示
    Python中用OpenPyXL处理Excel表格
    calendar函数使用说明【转】
    python之fabric2.0模块学习
    Day9
    Day8
    深入super,看Python如何解决钻石继承难题——转自楚门蔡的测视界
    python/socket编程之粘包
    os模块关于目录
    Day7
  • 原文地址:https://www.cnblogs.com/cj-xxz/p/12210557.html
Copyright © 2011-2022 走看看