闲话 1.8

实际上是模拟赛题解。

单纯记点东西,可能意义不明,建议别看。


标准型线性规划问题的形式如下:

\[\begin{aligned} &\max\,\, \sum\limits_{j=1}^n c_jx_j \\ &\text{s.t.}\,\, \begin{cases} \sum\limits_{j=1}^n a_{i,j}x_j\leq b_i & \forall i\in[1,m] \\ x_j\geq 0 & \forall j\in[1,n] \end{cases} \end{aligned} \]

考虑通过这些约束来得到比较“紧”的答案的上界。

把约束拿出来,不等式两边乘系数 \(y_i\) 后求和(\(y_i\geq 0\)):

\[\sum\limits_{i=1}^m y_i\sum\limits_{j=1}^n a_{i,j}x_j =\sum\limits_{j=1}^n x_j\sum\limits_{i=1}^m a_{i,j}y_i \leq \sum\limits_{i=1}^m b_iy_i \]

\(\forall j\in[1,n],\sum\limits_{i=1}^m a_{i,j}y_i\geq c_j\) 时,有:

\[\sum\limits_{j=1}^n c_jx_j\leq \sum\limits_{j=1}^n x_j\sum\limits_{i=1}^m a_{i,j}y_i\leq \sum\limits_{i=1}^m b_iy_i \]

于是我们得到了另一个线性规划问题:

\[\begin{aligned} &\min\,\, \sum\limits_{i=1}^m b_iy_i \\ &\text{s.t.}\,\, \begin{cases} \sum\limits_{i=1}^m a_{i,j}y_i\geq c_j & \forall j\in[1,n] \\ y_i\geq 0 & \forall i\in[1,m] \end{cases} \end{aligned} \]

这个问题就是原问题的对偶问题,对偶过程是相互的,且根据强对偶定理可以得知两个问题的答案是一样的。

这个形式非常好看啊。


考虑最大费用循环流的问题,设边的容量,费用和流量分别为 \(c,w,f\),可以表示为:

\[\begin{aligned} &\max\,\, \sum\limits_{u,v} f_{u,v}w_{u,v} \\ &\text{s.t.}\,\, \begin{cases} 0\leq f_{u,v}\leq c_{u,v} \\ \sum\limits_v f_{u,v}-f_{v,u}=0 \end{cases} \end{aligned} \]

其中两条约束分别对应容量限制和流量平衡。

等式约束是可以拆成两条不等式约束的,实际上在这里因为是循环流,只需要拆成一条即可:

\[\sum\limits_v f_{u,v}-f_{v,u}\leq 0 \]

然后你发现这个问题形式明明就是线性规划!考虑写出对偶问题:

\[\begin{aligned} &\min\,\, \sum\limits_{u,v} c_{u,v}x_{u,v} \\ &\text{s.t.}\,\, \begin{cases} \varphi_u-\varphi_v+x_{u,v}\geq w_{u,v}\\ x_{u,v} \geq 0 \end{cases} \end{aligned} \]

其中 \(\varphi_u\)\(x_{u,v}\) 都是变量,在求和时 \(\varphi_u\) 前面的系数为 \(0\)。既然如此也不用限制 \(\varphi_u\geq 0\) 了,因为可以给 \(\varphi_u\) 整体加 \(\infty\)

那么实际上 \(x_{u,v}\) 是可以直接取到最小值的,于是问题变为:

\[\min\sum\limits_{u,v} c_{u,v}\max(0,w_{u,v}-\varphi_u+\varphi_v) \]

当然把 \(\varphi_u\)\(\varphi_v\) 前的符号调换也是一样的。

这个形式也非常好看啊。


TopCoder-13952 Framville

先二分总时间 \(k\),记 \(l_i,r_i\)\(i\) 植物的生长时间为 \([l_i,r_i]\),整个问题的开始时间和结束时间分别是 \(s,t\),将问题转化成求最少代价:

\[\begin{aligned} &\min\,\, \sum\limits_{i=1}^n c_i\max(0,t_i+l_i-r_i) \\ &\text{s.t.}\,\, \begin{cases} s\leq l_i\leq r_i\leq t & \forall i\in[1,n]\\ s\leq t\leq s+k \\ r_i\leq l_j & \forall i,j\in[1,n],S_{j,i}=1 \end{cases} \end{aligned} \]

我们考虑将问题对偶成最大费用循环流的问题,所以要将约束转化成代价。

例如形如 \(x\leq y+k\) 的限制,其中 \(x,y\) 是变量,\(k\) 是常量,我们可以看做代价是 \(\infty\max(0,-k+x-y)\)

于是我们就可以对偶成网络流问题了:

\[\begin{cases} t\to s,(\infty,-k) \\ s\to l_i,(\infty,0) & \forall i\in[1,n] \\ r_i\to t,(\infty,0) & \forall i\in[1,n] \\ l_i\to r_i,(\infty,0) & \forall i\in[1,n] \\ l_i\to r_i,(c_i,t_i) & \forall i\in[1,n] \\ r_i\to l_j,(\infty,0) & \forall i,j\in[1,n],S_{j,i}=1 \end{cases} \]

最大费用循环流,把边权取反变最小费用,然后先强制流满负权边,再建超级源汇平衡流量即可。


考虑一下最小费用流的问题,其中 \(b_u\) 表示 \(u\) 点的流量需求:

\[\begin{aligned} &\min\,\, \sum\limits_{u,v} f_{u,v}w_{u,v} \\ &\text{s.t.}\,\, \begin{cases} 0\leq f_{u,v}\leq c_{u,v} \\ \sum\limits_v f_{u,v}-f_{v,u}=b_u \end{cases} \end{aligned} \]

其对偶问题就是:

\[\min\sum\limits_u b_u\varphi_u + \sum\limits_{u,v} c_{u,v}\max(0,-w_{u,v}-\varphi_u+\varphi_v) \]

洛谷P3337 [ZJOI2013] 防守战线

\(S_i\) 是前 \(i\) 个位置一共建的塔数,问题是:

\[\begin{aligned} &\min\,\, \sum\limits_{i=1}^n C_i(S_i-S_{i-1}) \\ &\text{s.t.}\,\, \begin{cases} S_{i-1}\leq S_{i} & \forall i\in[1,n] \\ S_{r_j}-S_{l_j-1}\geq D_j & \forall j\in[1,m] \end{cases} \end{aligned} \]

于是就可以转化成最小费用流的问题了,拿原始对偶算法跑流即可。


2016国家集训队论文集:《浅谈线性规划与对偶问题》——董克凡

2021国家集训队论文集:《再探线性规划对偶在信息学竞赛中的应用》——丁晓漫

载谭费用流对偶-whx1003

posted @ 2025-01-08 19:16  int_R  阅读(27)  评论(0编辑  收藏  举报