实际上是模拟赛题解。
单纯记点东西,可能意义不明,建议别看。
标准型线性规划问题的形式如下:
\[\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