以前学了很多次都没学明白,今天再来看看。
本文不会涉及单纯形法的知识点讲解,大部分题目侧重于线性规划对偶。
同样本文不会涉及相关知识点的证明,或是线性规划解的整数性说明,毕竟这只是一个总结性的文章。
拉格朗日对偶部分没学会,暂鸽。
线性规划标准型
对于任意线性规划,容易通过简单的变形使其变为以下形式(无限制的变量拆为两个非负变量作差):
maxcTxAx⩽bx⩾0
两个变量的线性规划:每条限制对应一个半平面,会交出一个不一定封闭的平面凸形,而最值可以看作最大化某直线纵截距,凸包二分即可。
整数线性规划
其要求自变量取到整数,这是 NP-hard 问题。不过很多情况下,我们遇到的线性规划问题都有整数最优解。
全幺模矩阵
若矩阵 A 满足任意子式值均为 {−1,0,1},我们称其全幺模矩阵。
在 OI 中,一个充分的判定方法是:系数在 {−1,0,1} 内,每列至多两个非零位置,且若某列有两个非零位置,将对应行连边,得到的图是二分图。
若约束为全幺模矩阵,整数线性规划可以看作普通线性规划求解。
任何最大流、最小费用最大流的线性规划都是全幺模矩阵。
标准型的对偶
我们定义一标准型线性规划的对偶为:
minyTbATy⩾cy⩾0
若 A 是 B 的对偶,那么 B 一定是 A 的对偶,称两者互为对偶。
对于某取等的限制,其改写成标准型后对偶会产生两个变量 y1,y2,我们需要最小化 b(y1−y2),y1−y2 可以写成一无限制变量 y(即可以小于 0)。因此取等的限制与无限制变量之间是对偶关系,这样推对偶会更方便。
强对偶定理
我们不加证明地指出——
对于线性规划 P,假设其对偶形式为 D,以下有且仅有一条成立:
- P,D 均有最优解且最优解相等;
- P,D 均无最优解;
- 仅有一者有可行解,且有可行解的目标函数在约束下无界。
互补松弛定理
对于一组对偶线性规划 P,D,x,y 分别为 P,D 最优解等价于以下两者同时成立:
- 若 xi>0,D 中对应的限制是紧的;
- 若 yi>0,P 中对应的限制是紧的。
(事实上反向也成立)
简证:我们令松弛变量 xs=b−Ax,ys=ATy−c,根据强对偶定理有:
yTAx+yTxs=yTb=cTx=yTAx−yTsx⇔yTxs+yTsx=0
如何还原方案
根据前文提到的互补松弛定理,我们若求出对偶定理的最优解,讨论每个变量是否为零,这样就能对应到原问题某个限制是否紧。
若原问题形式较好,我们通过某种方法还原了方案,此时根据互补松弛定理,任意合法解均为最优解。
一些模型
最短路模型:
maxdt−dsdy⩽dx+cx,y((x,y)∈E)
最大流模型:(为了方便,我们加入边 (t,s),流量为 ∞,因此可以要求源汇也满足流量守恒)
maxft,s0⩽fx,y⩽cx,y((x,y)∈E)∑(x,i)∈Efx,i=∑(j,x)∈Efj,x
最小费用流模型:
min∑wx,yfx,y0⩽fx,y⩽cx,y((x,y)∈E)∑(x,i)∈Efx,i=∑(j,x)∈Efj,x
市面上的形式都引入了 bx 这一变量表示 x 的出流量减入流量(可以看作一条连接源或汇的边),在这也记录一下:
min∑wx,yfx,y0⩽fx,y⩽cx,y((x,y)∈E)∑(j,x)∈Efj,x−∑(x,i)∈Efx,i=−bx
一些对偶
最小费用流模型的对偶:
令 zx,y 为第一个限制的对偶变量,px 为第二个限制的对偶变量:
max∑−bxpx−∑(x,y)∈Ecx,yzx,ypy−px−zx,y⩽wx,y((x,y)∈E)zx,y⩾0((x,y)∈E)px⩾0
消去 zx,y,整理得:
min∑bxpx+∑(x,y)∈Ecx,ymax(0,py−px−wx,y)
最大费用循环流模型的对偶:
我们先写出最大费用循环流的线性规划
max∑(x,y)∈Ewx,yfx,y0⩽fx,y⩽cx,y((x,y)∈E)∑(x,i)∈Efx,i=∑(j,x)∈Efj,x
对偶得:
min∑(x,y)∈Ecx,yzx,ypx−py+zx,y⩾wx,yzx,y⩾0
同样地消去 zx,y,整理得:
min∑(x,y)∈Ecx,ymax(0,py−px+wx,y)
其等价于上面最小费用流添加汇点到源点的边后令所有 bi=0,且令 w′x,y←wx,y 的结果,与我们的认知相吻合。
根据对偶的结果,我们可以得知若题目所求为这些结果的式子,可以对偶,并使用费用流/最大费用循环流解决。
一些例题
以下的例题若不特殊说明,默认变量非负。
① P3337 [ZJOI2013] 防守战线
令变量 pi 表示 [1,i] 建的塔数量,写出线性规划:
min∑ipi(Ci−Ci+1)pi+1−pi⩾0pRi−pLi−1⩾Di
改写目标函数为:
min∑ipi(Ci−Ci+1)+∑i∞max(0,−pi+1+pi)+∑i∞max(0,−pRi+pLi−1+Di)
使用上面的最小费用流模型解决。
② P3980 [NOI2008] 志愿者招募
写出线性规划:
min∑icixi∑lj⩽i⩽rjxj⩾ai
对偶得到:
max∑iaiyirj∑i=ljyi⩽cj
不过到了这一步好像只能单纯形?
也可以作前缀和变为上一题的形式然后再对偶,不过这应该是等价于直接做费用流的。
③ ABC224H Security Camera 2
写出线性规划:
min∑aixi+∑biyixi+yj⩾ci,j((i,j)∈E)
对偶得到:
max∑(i,j)∈Eci,jzi,j∑(u,i)∈Ecu,i⩽au∑(i,v)∈Eci,v⩽bv
经典的二分图最大费用流模型。
④ CF671D Roads in Yusland
首先有一种不需要线性规划的方法,也提一下:
令 fx 为覆盖了 x 子树与其父边的方案数,但 f 之间无法直接转移。我们 dfs 整棵树,对于每棵子树维护出很多 (c,t) 表示覆盖完这棵树后继续向上覆盖 t 步,最小代价是 c。
对于 y∈son(x),考察 y 的二元组 (c,t) 转移到 x,其产生的贡献是 c+∑z∈son(x),z≠yfz,于是我们可以使用支持全局减,合并,维护最大值的左偏树来维护所有方案,复杂度 O(nlogn)。
写出线性规划:
min∑cizi∑(xj,yj)∋izj⩾1
对偶得到:
max∑pi∑i∈(xj,yj)pi⩽cj
这就是经典的贪心了,要维护每条链被覆盖的次数,每个点贪心地减,同样使用左偏树做到 O(nlogn)。
⑤ HDU6974 Destinations
注意到问题可以被改写成:有 3m 条链,选择 m 条链使得互不相交(因为同一起点的路径两两相交),同时容易发现 m 是上界,我们将权值改为 inf−vi,即选择若干条不交链,最大化权值和。
写出线性规划:
max∑cizi∑(xj,yj)∋izj⩽1
对偶得到:
min∑pi∑i∈(xj,yj)pi⩾cj
这是经典的树上延迟贪心,我们 dfs 整棵树,在 lca 处考察路径,若点权和不够就补上来,树状数组维护,复杂度 O(nlogn)。
⑥ P7246 手势密码
写出线性规划:
min∑u,vzu,v∑(u,v)∋izu,v=ai
对偶得到:
max∑aipi∑i∈(u,v)pi⩽1
其中 pi 无正负限制。
于是直接令 fx,0/1 表示从 x 子树出发,权值和最大的路径值为 0/1 的最大答案,容易发现 pi 只会取 {−1,0,1},复杂度 O(n)。
⑦ P6631 [ZJOI2020] 序列
dxm 论文推法好像麻烦了点,类似上一题,我们有一个更简单的推法(其中 S 为操作构成的集族):
min∑T∈SxT∑T∋ixT=ai
对偶得到:
max∑aipi∑i∈Tpi⩽1
类似上一题地列出 dp,记录三类操作对应最大后缀和即可,容易发现值域 {0,1},复杂度 O(n)。
⑧ XX Open Cup GP of Moscow C Circles
写出线性规划:
max∑xixi+ximodn+1⩽si
对偶得到:
min∑siyiyi+yimodn+1⩾1
事实上可以证明,除了全为 0.5 的情况,其余时候均满足 yi∈{0,1},于是从前往后 dp 一下即可,环的限制不难拆,复杂度 O(n)。
⑨ CF1696G Fishingprince Plays With Array Again
写出线性规划:
min∑xi+yiXxi+Yxi−1+Yyi+Xyi−1⩾aix0=y0=xn=yn=0
我们发现第三行限制事实上是没有必要的,因为这些操作都可以找到对应不劣的合法操作代替。
对偶得到:
max∑aiziXzi+Yzi+1⩽1Yzi+Xzi+1⩽1
不妨设 X⩽Y,事实上可以证明,zi 的取值只有 {0,1X+Y,1Y},于是使用线段树维护矩阵乘法维护即可,复杂度 O(qlogn)。
⑩ P4642 [BJWC2008] 方程
线性规划式子在题面里就不列出来了,直接写出对偶形式:
minz1s+z2taiz1+biz2⩾ci
这里的 z1,z2 无正负限制,于是预处理半平面交,询问在凸包上二分即可,复杂度 O((n+q)logn)。
⑪ CODECHEF Chefbook
写出线性规划:
max∑piouti−qiinisx,y⩽wx,y+px−qy⩽tx,y((x,y)∈E)
将 wx,y 的影响消去,对偶得到:
min∑(x,y)∈E−s′x,yfx,y+t′x,ygx,y−∑(x,i)∈Efx,i+∑(i,x)∈Egi,x⩾outx∑(x,i)∈Efx,i−∑(i,x)∈Egi,x⩾−inx
容易转成前面提到的最小费用流模型,而这题还要求构造方案,使用前文提到的还原方法,问题变为了差分约束,任跑一组解即可。
⑫ bzoj3118 orz the mst
对于每条非树边,其限制为权值大于等于路径上所有边,容易写出:
min∑e∈Tbexe+∑e∉Taexexe+we⩾wi−xi(i∈Pe,e∉T)
对偶得到:
max∑i∈Pe,e∉T(wi−we)ye,i∑i∈Peye,i⩽ae(e∉T)∑Pe∋iye,i⩽bi(i∈T)
暴力连边,经典的二分图费用流模型。
⑬ P4412 [SHOI2004] 最小生成树
上一题的子问题。
⑭ CF1765J Hero to Zero
先证明一个经典结论:在一张带权二分图中,最大带权匹配的权值和恰好为最小顶标和。
写出最大带权匹配的线性规划:
max∑(x,y)∈Ewx,yzx,y∑(x,i)∈Ezx,i⩽1(x∈L)∑(i,x)∈Ezi,x⩽1(x∈R)
对偶得到:
min∑i∈Lpi+∑i∈Rqipx+qy⩾wx,y((x,y)∈E)
证毕。此时再回顾 ⑫,其无非是将最小顶标和对偶成了最大带权匹配问题。
回到这个问题,我们直接设 xi,yj 分别表示某一行/列操作数量,写出线性规划:
min∑xi+yi+∑i,j(ci,j−xi−yj)=∑ci,j−(n−1)(∑xi+yi)xi+yj⩽ci,j
这就是最小顶标和模型,对偶成最大匹配后容易使用贪心解决,复杂度 O(nlogn)。
⑮ 2022 集训队互测 Round 7 B 卑鄙的下毒人
令原材料毒药数量前缀和为 qi,写出线性规划:
mink(qn−q0)+∑imax(0,ai−(bRi−bLi−1))qi⩽qi+1
式子很类似最大循环流模型,将 qi⩽qi+1 带上 ∞ 的权值写入目标函数中,直接应用上面的式子得到建图:
- (0,n,k,0);
- (Ri,Li−1,1,ai);
- (i+1,i,∞,0)。
我们可以去除 (0,n) 的边变为有源汇最大费用流,取负变成最小费用流,由于有负权,我们需使用原始对偶求解。第一轮的势能计算也可以不使用 spfa,因为此时图为 dag 可以直接递推。
⑯ CF1307G Cow and Exercise
写出线性规划:
maxzn−z1zy⩽zx+cx,y+wx,y((x,y)∈E)∑(x,y)∈Ewx,y⩽C
对偶得到(注意 z 是不限制正负的变量,对偶后是取等的限制):
min∑(x,y)∈Ecx,yfx,y+Cg∑(x,i)∈Efx,i−∑(i,x)∈Efi,x=⎧⎨⎩1x=1−1x=n0otherwise−fx,y+g⩾0
其很类似最小费用流模型,稍微变形得到:
min(∑(x,y)∈Ecx,yfx,y+C)g∑(x,i)∈Efx,i−∑(i,x)∈Efi,x=⎧⎪
⎪⎨⎪
⎪⎩1gx=1−1gx=n0otherwisefx,y⩽1
注意到 ∑(x,y)∈Ecx,yfx,y 为每条边流量在 [0,1] 内的图,流量恰好为 1g 时最小费用流费用大小,即求:
maxmincost of flow(h)+Ch
虽然 h 是任意实数,可以证明对于任意区间 [t,t+1](t∈Z),最值永远在边界取到。
众所周知,最小费用最大流是凸的,于是记录下每次增广结束后的流量与费用,其不重不漏地构成了凸壳上所有位置,每次询问暴力遍历凸壳即可,复杂度 O(nm2+qm)。
⑰ loj#6511. 「雅礼集训 2018 Day8」B
二分答案,我们考虑最小化支出,写出线性规划:
min∑cizidy⩾dx+wy−zy((x,y)∈E)di⩽mid
消去 zi 可以发现这是最大费用循环流模型。
⑱ CF375E Red and Black Tree
有树形背包做法,这里仅讨论对偶做法,写出线性规划:
min(1−ci)zi∑dis(x,i)⩽Xzi⩾1∑zi=m
容易发现不会有 zi⩽1,对偶变为标准型,使用单纯型法解决。
⑲ 2021 集训队互测 Round 4 B 机器
🕊。
⑳ P8182 「EZEC-11」雪的魔法
🕊。
参考资料:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!