模拟赛感觉考了好几次,受不了了学一下。
与其说是学习笔记可能不如说是抄一遍集训队论文(大雾
前言
哪个傻逼天天往模拟赛塞这东西。
基本介绍
定义
有一组变量
然后你需要求
标准型
考虑称如下有
- 目标求的是式子
的最大值; - 第
个约束的形式为 ,即只有小于等于号的要求。 - 对于每一个变量
,额外约束 。
对于一个不是标准型的线性规划:
- 若其不满足第一条,求
的最小值,则相当于求 的最大值。 - 若其不满足第二条,若出现了大于等于号,也像第一条一样反转一下;出现等于号就拆成一个大于等于和一个小于等于。
- 对于一个变量
,将其拆成两个变量 ,并且要求 ,即可满足第三条。
也就是说,对于任意一个线性规划,我们都能将其转化成标准型。
接下来,我们只需要探讨标准型如何求解。
线性规划对偶
标准型的对偶
上述标准型的对偶为一个有
- 求式子
的最小值。 - 第
个条件为 。 - 额外要求
。
对偶定理
为什么会存在对偶这么个鬼东西呢,考虑这么一个问题。
现在有两个变量
这样我们就找到了
考虑计算
现在回到上面的标准型,我们希望用这种方式,找到答案的一个上界。
如果我们将第
显然我们需要有
而我们希望这个上界越紧越好,也就是说我们希望最小化
不难发现,这正好就是标准型的对偶形式。
至此我们证明了弱对偶定理:上述标准型的答案小于等于其对偶的答案。
当然还有一个强对偶定理:标准型的答案等于其对偶的答案。不会证。
同时,不难发现,标准型对偶的对偶也是标准型,后面要用。
拉格朗日对偶
我是鸽子谢谢。
最小费用流的线性规划
考虑现在有这么一个费用流模型,特殊的,这里的流为循环流。
这张图里,我们要求点
并且对于边
其答案显然可以使用最小费用流跑出。
(如果图中可能会凭空出现负环的话,应该需要通过上下界网络流把费用全变成正边处理)。
(我这里的
那么考虑将这个最小费用流的模型用标准型对偶的形式表达出来,其中边
那么我们想要求的是
求
也就是说能得到
现在我们求的相当于是
或者说求
例题
[ZJOI2013] 防守战线
题意
现在有
现在有
求最少的花费。
题解
考虑设前
那么
此外因为塔的个数不能是负数,所以有
花费就是
将要求的东西和限制写在一起,即求
这显然可以用上面说的最小费用流进行解决。
好那么脑瘫的事情来了,我们好像没有约束
不难发现,如果我们给
所以我们并不需要约束
提交记录,懒得卡常了。感觉改成原始对偶包能过的。
欸我怎么忘了原始对偶怎么写的,复习一下。
我们发现普通费用流的瓶颈主要在于 spfa,所以我们想办法把 spfa 优化掉。
考虑类似 johnson 全源最短路的东西。
如果我们可以给每一个点一个势能
那么我们直接把边权从
显然,对于任意一个没有负环的图,这样的一组势能都是存在的,因为直接拿最短路当势能就是可行的。
但问题在于,我们跑网络流的时候,边的形态是会变化的,那么这个时候每一个点的势能怎么办呢。
假设我们已经求出了当前的一组合法势能
那么我们直接让点
对于原来的一条有向边
移项,直接就可以得到
对于在增广结束后,新出现的边
也就是说一定有
所以我们直接这样弄一下,就可以得到新的势能。
所以我们只需要初始跑一遍 spfa 就好了,后面直接跑 dijkstra。
在一些特殊的题中,初始图情况简单,spfa 都不用跑(比如这个题)。
[Aizu2230] How to Create a Good Game
题意
给定一张边权为正的
DAG,现在你可以进行若干次操作,每一次操作可以给一条边边权加上
要求所有操作结束之后点
对于每一个点
题解
设初始时点
那么我们需要最大化
不难发现,若将
所以我们直接将前两个条件重写为
列出式子,
显然还是可以用网络流解决,很牛。
提交记录。
[Utpc2012] じょうしょうツリー
题意
给定
每一次可以花费
现在要让每一个点的点权都严格小于父亲的点权,求最小操作次数。
题解
设最终点权为
则需要最小化
存在限制
不难发现,
那么可以直接写出式子
还是一样,发现前面两个部分只有一个变量,所以考虑引入
式子变为
这样变完之后,相当于每一个点
这样操作显然是没用的,因为我们只要求了
但是这个题比较特殊,首先
其次,图里面根本没有出现源点和汇点,所以这还是一个循环流。
首先观察这个图长什么样子,首先一共有
- 对于
, 到 有边权为 的边。 - 对于
,有 到 的边权为 的边。 - 对于
,有 到 的边权为 的边。
我们需要求出这张图的最小费用循环流。
第一种边的代价很烦,我们直接初始给每一个点点权加上自己的深度,这样第一种边就没有代价了。
不难发现,这相当于需要找出若干对点,其中一对点
现在的目标是让所有点对的贡献之和最小。
那么先考虑,如果整棵树是一条链,怎么做。
不难发现,这其实是一个原题。(大雾
这可以简单的使用模拟费用流解决,只需要用一个堆来维护就好了。
放到树上我们发现直接把堆变成可并堆或者直接启发式合并就对了。
提交记录,超级好写。
[核桃周赛052] 构造
题意
给定一张
求
题解
首先如果原图有环肯定无解,否则一定存在解。
先写成线性规划的形式,求的是
对于
式子是
那么我们直接把图建出来,然后跑费用流就能求出最小值。
问题在于怎么构造方案呢,一般的线性规划式子是并不支持构造方案的。
重新观察我们建出来的图长什么样,为方便起见我们将上面的边全部反向建,那么原图存在两种边:
- 对于
,有 连向 的 边。 - 对于点
,若 ,则从源点 向 连 的边。 - 对于点
,若 ,则从 向汇点 连 的边。
考虑,若一条网络中的边
手玩一下,发现这代表着
(证明的话,不会,但自己手玩一下就能感觉到它很有道理)。
那么我们直接跑一个差分约束就好了。
提交记录。
QOJ4213 Circles
题意
给定一个长度为
称非负(不一定是整数)序列
令
给定序列
题解
首先考虑怎么求单组的
先写成线性规划的形式,求
有限制
令
写出对偶形式,求
限制是
那么显然不可能出现