网络流&二分图选记

前言

这里会简单记录一下在网络流题目中碰到的有价值的点。

其实就是cmd博客的学习记录。

大概会随学习进度更新。

基本最大流

这里是指用流量去限制移动、选择之类。

也可以把流量当做状态。

用流量限制选择个数,按转移建图。

发现普通建图无法处理拿出来的子序列有 s 的长度。

其实可以建立分层图,因为 LIS 具有分层图的结构,只有上一层的点才能连到下一个点,这样就可以得到长度必须是 s 的限制。

用流量限制技能的次数,流量看做是光明程度变化的过程。

发现操作都是一个区间连向另外一个区间,所以可以线段树优化建图。

(类)二分图匹配

基本的二分图匹配其实就是把物品当做是要操作的元素(操作可以是选择、移动、确定一个方案之类)

也有通过满流判断是否有解来搭配二分的做法。

还有些二分图的变种,比如三分图之类,但是只要右边的边不会连到左边来就还可以算是"二分图"。

基本 棋盘+只能处理相邻两格 都会二分图相关。

先考虑没有硬石头的情况,就相当于不能在同一行或同一列放置两个炸弹。

而硬石头的存在可以视作把完整的行/列分成了若干互不影响的段,按段的编号建立二分图即可。

如果没有人类上下左右的限制,相当于一次可以给相邻的两格权值都减少 1 ,直接跑二分图多重匹配即可。

而若加上人类上下左右的限制,就意味着上下只能选一个,左右也只能选一个,同时加上限制跑二分图匹配即可。

先乘以 105 变成整数问题。然后考虑二分答案,同时给奶酪的存在时间离散化。

这样我们就得到 O(n) 个时间段,每段内奶酪的存在情况都是确定的,而每只老鼠在这段时间里吃的大小也是可以知道的,这样就是一个匹配问题了。

但是有一个问题:我们无法做到在一个时刻一只老鼠吃一个奶酪。

考虑差分,设 di=sisi1,这样对于 i (已经不能叫做是第 i 只老鼠了)来说,在一段时间内的吃的大小就是 di(ni+1)t ,而它给该时段内每个奶酪连的边的容量是 di 。这样就解决了一个时刻只有一只老鼠吃一个奶酪。

结论题,答案就是度数不为 t 的倍数的点的个数。

主要是构造过程。先求出每个点个度数 di (默认右边的点的标号 +n)。

发现对于点 x ,你需要给每 dxt 个边染一种颜色,多出来的边染不同的颜色。

然后对于当前 t ,有如下选法:

  • t|dxx 恰好选择 dxt 条边。
  • 否则 x 可以选择 dxtdxt+1 条边。

然后给这些边染成第 t 种颜色之后,就变成了 t=t1 的问题,而且并没有影响答案。

所以可以依此构建二分图,首先是正常的二分图建图,连向源/汇点的流量是 dxt 。但是发现可能会流不满,那么就占用可以流 dxt+1 的点,可以设置这些点有 1 的额外流量。

如果直接让额外流量连向源汇点会一个问题,就是可能额外流量的存在使当前最大流不会使本该流满的边流满,而我们的额外流量是为了帮助流满的。

所以我们考虑这样建图:(STT 只有在源点流出来的总流量 su1 大于右边的总流量 su2 时才会有 su2su1 的容量,SST 就是反过来。)

为什么?其实我还没有搞明白,只是觉得很高级...或许之后会补...

最小割

最小割这种东西,个人感觉会比最大流玄学一点。

一般会把割掉某条边看成是放弃某个收益,或承受某个代价。

然后你需要把目标状态对应到网络中的 ST 不连通的状态。

有时还会加一些 inf 边去限制一些方案以满足题目要求。

网格+没有公共边 二分图。

然后假设我们把所有数都给选了,然后需要舍弃一些方格以保证 没有公共边 的要求。

那么我们考虑用割的形式,一个点连向 源、汇 的边的容量就是该点的权值,相邻的点连inf 防止被割。这样没有公共边的限制就和 ST 不连通挂上了。

和上题相同,先假设把所有房子都卖了,然后考虑舍弃一些房子或承担一些修墙费用。

这里舍弃房子和上题相同,修墙费用就是割掉一条路,那么就把这条路的容量设为修墙费用。

这题中需要满足的条件是不联通,那么路就要改成双向边。

考虑题目中的上下截断,那么我们对于每一行一列 (x,y) 来说,把 (x,y,1) 连源点,把 (x,y,R) 的点连汇点,中间点按权值串联,这就是一个最小割问题。

考虑相邻两竖列切点不超过 D ,这其实就是让我们排除某些不合法的割的方案,那么我们给某个 (x,y,z) 的位置,向着四相邻竖轴 (x,y,zD) 的位置连 ⁡inf 边。这样就保证了如果割了(x,y,z) 而且割了 (x,y,zD1) 的话,那么 (x,y,zD1) 就白割了,因为还是会有流量流过来,这样就保证了方案满足要求。

题目的图暗示(假装被暗示了)我们给图染三色,但是有两个条件,形如 (a,b,c) 不能同时存在,如果直接在三分图上连边、跑最小割就会有一个问题,本来 (a1,b,c1) 的限制加上 (a2,b1,c2) 的限制,在这个图中就变成了 a1,a2b1c1,c2 不能同时存在。所以这种三种或三种颜色以上的都不能直接上最小割。

那怎么办,考虑找这个 (a,b,c) 的限制有什么特殊性。

发现对于在能量源上的水晶,周围的水晶只能保留一种颜色的的水晶,这样我们就可以对中间的点向两边连一次边,就不会出现上面说的这种多次限制导致互相影响。

同样的题还有:P3756 [CQOI2017]老C的方块

这个题代表了一类最小割题目,就是选择只有两种,可以划分为 S,T 两个集合来区分,然后对于 xS 集合中有一些贡献,在 T 集合中有一些贡献,而 a1,a2,...,ak 这些点同时在 ST 中有一些贡献。

同样,我们先考虑所有贡献都拿到了,然后割去一些贡献以满足要求:一个点不能同时在 S 中又在 T 中,其实就是使 ST 不连通。

如果没有这些额外贡献,是很好做的,有了额外贡献,就只需要考虑到如果把组合中任意一个点 ai 分到了另一个集合,那么就必须要割掉这个贡献。

所以可以这样建图:我们对每个组合建立虚点,和源、汇点相连,边权为额外权值。然后连边到对应的物品上,边权为 inf 防止被割。如果要割掉任意一个物品边,都必须要割掉所对应的所有集合边,否则白割。

最大权闭合子图

闭合子图是指,在一个有向图中的子图 S,并且不存在一条边 xy,使得 xS,但 yS

而最大权就是给每个点有一个权值(有正有负),需要你选取的闭合子图权值和最大。

处理这类问题,我们是把其转化为最小割问题来解决的。

假设我们把所有正权点都选了,考虑割掉一些选了的点,或承受一些负权点使得满足闭合子图的条件。

那么我们将原图中的一条边 xy 变为网络中的 (x,y,inf) ,同时对于正权点连 (S,x,valx) ,负权点连 (x,T,valx) 。这样若网络中还有流量,那么就意味着还有正权点没有舍弃或负权点没有承受。

一般只要出现了要选 x 就必须要选 y 的时候就是最大权闭合子图。

对于每个收益建虚点,注意都到要想得到这个收益,就必须要选择一些点,那么就给对应的要求连边,最后就是求该图的最大权闭合子图了。

(A×BC)AT ?什么玩意?

尝试化一下式子:i=1n(j=1nAjBi,jCi)Ai=i=1ni=1nAiAjBi,ji=1nAiCi

因为 Ai 只能是 0,1 那么这个式子的意思就是:同时选 Ai,Aj 可以得到 Bi,j 的收益,但选 Ai 就会付出 ci 的代价。

直接做会有 n2 的点,有优化方法,但好像不优化也能过去。

注意到想要得到 dl,r 的贡献就必须要得到 dl+1,rdl,r1 的贡献。但是还有费用的问题。

m=0 那么就是 dl,l 还需要 al 的费用,而 m=1 时就意味着若选了类型 x 的任意一个就需要 x2 的费用,同样也是要选 x 就必须要选 y 的形式。

若不存在租用,完成一项工作必须购买对应的所有机器,这就是个经典的最大闭合子图问题。

考虑租用,就是可以花费一定代价删去依赖关系,那么稍微改一下建图就可以:每个工作向对应的机器连边的边权为租用费用,其余就是最大权闭合子图。

DAG(偏序集)相关

我们采用调整的思想。首先将每个点用单独一个路径覆盖,然后考虑不断合并两条路径,最终总路径最少。

我们拆出入点变成二分图,对于图中原有的边,从出点连向入点。这样某条边 (x,y) 被选中,就相当于将 x 路径的末尾连上了 y 路径的开始。

正好路径不能交叉、汇合,也满足二分图匹配的问题。


回到偏序集,首先要明白什么是偏序集。

偏序集 (S,<) 满足集合中值元素之间存在大小关系 x,yS,x<y,允许不可比(无定义)的情况出现。但是比较一定有传递性  x<y,y<zx<z,且不能互相矛盾  x<y,y<z,z<x。其实可以看成是 DAG。

对于偏序集中的一个子图,若任意两个点都可比,叫做是偏序集的链。(注意:这里与图中的路径不同,这里只要求被推导出的关系联通,而不要求在初始的关系中就联通。

而一个子图,任意两个点都不可比叫做反链。

不同于最小路径覆盖,在求偏序集的最小链覆盖问题时,我们是需要先求出传递闭包的,这样才能满足链的定义。求出一个点所有可以到达的点之后,就是上面的做法了。

考虑二分,二分之后问题就变成了能否覆盖所有关键点(也就是 valx<mid 的点)。

如果直接上 最小路径覆盖 就会有一个问题:对于 valx>mid 的点,是不需要被覆盖的,但也不能把它给拿掉(可以作为中间点)所以这里需要求的是 偏序集的最小链覆盖 。

首先有 Dilworth 定理:最长反链大小=最小链覆盖数量。

考虑构造答案,又有一定理:对于求最小链覆盖的时候的二分图,求出一个最大独立集 I ,对于一个点 u 如果满足出入点都在 I 内,则将其加入最长反链答案集合 A

之后又有更简单的判断方式: u 的入点与 S 联通,且出点不与 S 联通 u 在最长反链中。

证明?没有。

本文作者:qwq_123

本文链接:https://www.cnblogs.com/qwq-123/p/15962266.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   qwq_123  阅读(101)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起