省选前网络流练习

棋盘模型

H - LaserTowersDiv1

对于一个棋盘上有若干个给定方向的炮塔,能够打到对应方向上的一个格子,有的格子有权值,但是不同炮塔的路线不能交叉,保证没有两个炮塔在同一行或者同一列上。

由于只限制不交叉,所以我们可以想到利用最小割求解,S连接所有横向炮塔,T连接所有纵向炮塔,然后把边权设置为能够打到范围的最大权值减去打到当前位置后损失的权值,然后把对应链连接起来,如果有交叉从S就能够到达T。
但是这样跑还是有问题,因为可能割掉之后剩下的边会对之后产生影响,所以把点拆成行点和列点,然后从行点向列点连边,这样需要限制只能是进入行点从列点离开,而不能是进入列点从行点离开,那么拆点之后连一条单向边即可。

E - CurvyonRails

棋盘模型有两种处理方法。
第一种就是将行列分开处理,然后相互连边,就可以构成一个二分图。
第二种方法就是将格子上所有点按照i+j的奇偶性分开处理,同样会形成一个二分图,然后就可以处理棋盘上的一些路径问题。

对于这道题给定一些空地和关键点,要求一条路径将所有空地填满,并且每个格子恰好和相邻的四个格子中两个相连,并且要求关键点走直线的状态尽量少。

首先利用棋盘模型建立二分图,然后源点向奇点连流量为2的边,奇点向偶点连流量为1的边,偶点向汇点连流量为2的边,跑出来满流则存在路径。然后考虑让关键点走直线的状态尽量少,考虑利用费用处理这种限制,那就是选择两个同方向的边就会产生额外费用。这是经典的多次选择最后一次产生费用的模型我们将方向相同的点放到一起,然后建一个虚点连接,然后建两条边一个没有费用一个有费用,然后跑网络流即可。

F - BoardPainting

对于一个棋盘上面有若干点需要染色,每次可以横着或者竖着染连续的一段,求解最少需要染多少次能够将所有需要染色的点染色。

首先有一个类似的题目是每次可以覆盖地染,但是有多种颜色,那道题我们可以通过建立虚点来处理染一段的操作,但是这道题由于不能重复覆盖,所以不能这样做。

另外这种链覆盖的问题,有一个思路就是先打散,然后考虑每条边相当于是将两个点合并,然后我们需要找到尽量多的边合并,所以建立虚点表示合并,连接到源点的虚点表示横向的合并,连接到汇点的虚点表示纵向的合并,然后将虚点和对应点连边,但是需要限制合并不能拐弯,那么对应的就是S到T不连通即可,所以求解最小割即可。答案就是最小割加1。

关键利用了先打散然后合并的思想,然后利用虚点来限制联通。

其实将所有段打散后就变成了一个简练的模型,现在有两类点,这两类中有些点有矛盾关系,同一类点中没有矛盾关系,选择最多的点使得两两之间没有矛盾关系,那这实际上就是一个二分图最大独立集问题。我们直接用总点数减去最大匹配即可。

上下界网络流

B - XWW的难题

经典的有源汇上下界最大流
还是矩形的模型,现在需要让每个数取整,然后满足两侧的数取整后等于这一行或者一列的数的和。那么我们建立源点和汇点,然后把流量下界设置为下取整,上界设置为上取整,然后直接跑有源汇上下界最大流即可。先跑可行流,然后答案加上S到T的边权,然后再跑最大流,二者之和乘以3就是答案。

注意一个代码细节:memcpy必须要求数组大小不会爆掉,否则就会RE。

虚点优化

C - Game of Numbers

首先有两个长度为n的序列A和B,然后考虑其中所有点对每次选择一对Ai>Bj和Ai<Bj的点对,要求这四个数的gcd不是1,然后每个点对只能选择一次,求解最多能够选择几次。
n<=500 Ai,Bi<1e9

显然是一个匹配问题,关键在于gcd的限制,暴力的方法就是两两枚举点对然后连边,但是复杂度不对,考虑优化连边,不妨枚举质数然后连接两个点对到质数上,然后考虑这样做的复杂度,我们一共需要考虑 O ( n ∗ w ( a i ) ) O(n*w(ai)) O(nw(ai))个质数,大概只有几千,然后 O ( n 2 ) O(n^2) O(n2)枚举所有点对,然后枚举他们gcd的质因数复杂度是 O ( n a i ) O(n\sqrt{ai}) O(nai ),网络流总边数为O(n*w(ai))个多以可以跑过。

最小割必须边和可行边

P4126 [AHOI2009]最小割

最小割必须边和最小割可行边

退流技巧

P3308 [SDOI2014]LIS

退流技巧
现在有一个序列,每个数都有一个删除代价和附加属性,要求使用最少的删除代价使得序列最长上升子序列长度减少,然后输出附加属性字典序最小的一组解。

首先第一个问题很典型就是dp上跑一个最小割,然后需要进行拆点即可,然后关键问题在于求解字典序最小的最小割。

我们可以考虑从小到大贪心,然后每次选择的边需要判断是否是最小割可行边,只需要进行一次bfs即可,然后需要将这条边割掉后,将这条边删除,因为割掉这条边后有些边就不会再成为割了。所以这是一个经典的退流技巧,专门处理删边的问题,我们从u到S跑最大流,v到T跑最大流,然后将边删除即可。

删边问题使用退流,加边问题可以直接继续增广即可。

线性规划切糕模型

G - FoxAndCity

这道题是一个很巧妙的切糕模型。
现在给出了一个无向连通图,每个点的点权为wi,然后可以任意加边,最小化 ∑ ( w i − d i ) 2 \sum(wi-di)^2 (widi)2di为1到i的最短路。

然后这里需要考虑最短路中每条边所对应的限制,本质上一条从u到v的有向边对应的是 d i s v − d i s u < = 1 dis_v-dis_u<=1 disvdisu<=1通过任意加边我们能够使得所有满足限制的dis出现,那么实际上就相当于现在有n个变量,然后有边数个限制,每个限制都形如 x − y > = 1 x-y>=1 xy>=1每个变量取值对应权值,那么这就是一个经典的切糕模型了。

关键在于想到把最短路的边看作是一个线性规划的限制,然后利用网络流求解。

线性规划对偶原理

A - Orz the MST

给定一个n个点,m条边的无向图,每条边增加1需要花费ai减少1需要花费bi,求解最小花费使得原图的最小生成树为给定的生成树。

首先可以发现树边一定减小,非树边一定增加,用 d i d_i di表示第i条边权值的变化量,然后我们可以列出一个不等式 d i + d j ≤ w i − w j d_i+d_j\le{w_i-w_j} di+djwiwj然后需要最小化 ∑ a i d i + ∑ b i d i \sum{a_id_i}+\sum{b_id_i} aidi+bidi然后我们发现这是一个对偶原理的形式,所以我们可以转化为对偶问题。

然后最关键的是要记住对偶问题的变量限制对应了原问题的条件限制,对偶问题的条件限制对应了原问题的变量限制,有的时候需要反转符号。
具体地,大变小,最后变量限制反转;小变大,最后条件限制反转。

那么对于这道题的限制都可以用矩阵表示,然后转化为对偶问题之后就变成了一个二分图的模型需要求解最大费用可行流即可。最大费用可行流只需要每次bfs后限制dis必须大于0,这样就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值