网络流&二分图选记

前言

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

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

大概会随学习进度更新。

基本最大流

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

也可以把流量当做状态。

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

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

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

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

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

(类)二分图匹配

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

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

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

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

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

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

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

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

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

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

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

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

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

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

发现对于点 \(x\) ,你需要给每 \(\frac{d_x}{t}\) 个边染一种颜色,多出来的边染不同的颜色。

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

  • \(t| d_x\)\(x\) 恰好选择 \(\frac{d_x}{t}\) 条边。
  • 否则 \(x\) 可以选择 \(\frac{d_x}{t}\sim \frac{d_x}{t}+1\) 条边。

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

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

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

所以我们考虑这样建图:(\(S\rightarrow TT\) 只有在源点流出来的总流量 \(su_1\) 大于右边的总流量 \(su_2\) 时才会有 \(su_2-su_1\) 的容量,\(SS\rightarrow T\) 就是反过来。)

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

最小割

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

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

然后你需要把目标状态对应到网络中的 \(S\)\(T\) 不连通的状态。

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

网格+没有公共边 \(\rightarrow\) 二分图。

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

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

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

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

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

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

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

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

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

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

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

这个题代表了一类最小割题目,就是选择只有两种,可以划分为 \(S,T\) 两个集合来区分,然后对于 \(x\)\(S\) 集合中有一些贡献,在 \(T\) 集合中有一些贡献,而 \(a_1,a_2,...,a_k\) 这些点同时在 \(S\)\(T\) 中有一些贡献。

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

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

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

最大权闭合子图

闭合子图是指,在一个有向图中的子图 \(S\),并且不存在一条边 \(x\rightarrow y\),使得 \(x\in S\),但 \(y\notin S\)

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

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

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

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

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

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

\((A\times B-C)A^{T}\) ?什么玩意?

尝试化一下式子:\(\sum_{i=1}^n(\sum_{j=1}^n A_{j}\cdot B_{i,j}-C_{i}) A_{i}=\sum_{i=1}^n\sum_{i=1}^n A_{i}\cdot A_{j}\cdot B_{i,j}-\sum_{i=1}^n A_{i}\cdot C_{i}\)

因为 \(A_i\) 只能是 \(0,1\) 那么这个式子的意思就是:同时选 \(A_i,A_j\) 可以得到 \(B_{i,j}\) 的收益,但选 \(A_i\) 就会付出 \(c_i\) 的代价。

直接做会有 \(n^2\) 的点,有优化方法,但好像不优化也能过去。

注意到想要得到 \(d_{l,r}\) 的贡献就必须要得到 \(d_{l+1,r}\)\(d_{l,r-1}\) 的贡献。但是还有费用的问题。

\(m=0\) 那么就是 \(d_{l,l}\) 还需要 \(a_l\) 的费用,而 \(m=1\) 时就意味着若选了类型 \(x\) 的任意一个就需要 \(x^2\) 的费用,同样也是要选 \(x\) 就必须要选 \(y\) 的形式。

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

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

DAG(偏序集)相关

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

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

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


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

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

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

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

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

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

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

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

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

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

证明?没有。

posted @ 2022-03-03 22:35  qwq_123  阅读(95)  评论(0编辑  收藏  举报