Loading

[专题总结]二分图和网络流(习题篇)

传递闭包应用

Explosion. (2014 ACM/ICPC Asia Regional Beijing Online)

有n个房间,每个房间内有打开一些门的钥匙。初始时所有房间门都被锁了,且你手上没有任何钥匙。
当你没法用手上的钥匙打开房间门时,你会在还未被打开的房间中,随机选择一个并轰炸它,从而得到该房间内的所有钥匙。当你能用手上的钥匙打开房间门时,就会立即打开它并获得钥匙,不会选择轰炸。
求期望轰炸多少次,使得所有房间门都被打开。 数据范围:n≤2000。

不错的一道题,期望的线性性部分之前做过原题,还是没想到。

转化成图论模型, \(i\)\(j\) 的钥匙则 \(i\)\(j\) 连边。

那么期望时间就是炸每个房间的概率之和(线性性)

只有所有能到它的点都没被炸,他才会被炸,所以就是求出能到达他的点有多少个,缩点拓扑即可。

实时路况. (2016计蒜之道复赛)

这题考得是对弗洛伊德算法的理解,上文提了本质是一个动态规划加入每个点的过程。

所以容易发现加入点的顺序并不影响答案。

不经过这个点的答案就是 Floyed 过其他 n-1 个点,但是没 Floyed 它。

不知道为什么要 考虑分治即可,现在知道了,删掉每个点考虑分治是经典套路。

Dilworth应用

CF1017C

给定一个数 n 。求构造一个长度为 n 的排列,使之 LIS+LDS 最小。

若 LIS 长度为 L, 则会有 L 个DS, 为了让 LDS 最小,应该让每个 DS 长度平均。
故 LIS = LDS = \(\sqrt n\) 是最优,构造直接 \({n−i+1,n−i+2,...∣n−2i+1,n−2i+2,...∣...}\)

CF1097E

由上一题一样的构造可以知道 \(k=O(\sqrt{n})\)

那么我们一开始每次找一个 LIS,然后删掉,直到 LIS 的长度 \(\leq k\) , 那么 此时可以划分成的IS \(\geq {len / k}\), 也就是 LDS \(\geq {len / k}\)\(len\) 是剩余的长度,所以之后一直去删 LDS.

这两道题利用 LIS 和 LDS 在 dilworth 上的 根号平衡做的,是一个经典结论

CF1296E2

发现最长下降子序列内的元素颜色两两不同,且两个元素逆序颜色就要不同。

构造考虑他是以他结尾的最长下降子序列的第几个,就让他的颜色是什么,形成逆序的颜色必定不同。

Vizing定理例题

Uoj444

对于一张给定的图,不平均度是 $ \sum_{i=1}^{n} [k|deg_i]$ 。

证明考虑把每个点拆成 \(\lceil \frac{deg_i}{k}\rceil\) 个点,前面的连 \(k\) 条边,最后一个连 \(deg_i \mod k\) 条边。

那么对这张图使用 Vizing 定理,可以得到每个点颜色不同的一组构造,易知极差不超过1。

考虑加边,直接动态维护就好了,删边比较麻烦,如果删除的是最后一个节点,那么直接删掉就好了。

如果删除的边不是最后一个节点的,那么看看最后一个点有没有这个颜色,如果有就直接换一下。
没有的话找一个当前点的增广路换成一种最后一个点有的颜色,再根最后一个点换一下。

AGC037 D

Hall定理 部分

Hall应用

NOIP模拟41 C

树剖+bitset,之后变成了求存在带权完美匹配的最大权。

直接考虑推论二去找到最大的符合条件的,也就是枚举所有集合中\(W_{N(S)} - W_{S}\)最小的。

CF981F

一个环,先考虑所有的区间,他们不可能互相跨过形成一个环,所以可以直接复制断环为链。

一个关键的观察:所有的区间不相交, 假设 \(l_1\leq l_2 \leq r_1 \leq r_2\)\(, [l_1,r_1], [l_2,r_2]\) 相交,假设变成 \([l_1,r_2],[l_2,r_1]\) ,那么所有区间的长度不变,并且 \([l_1,r_2]\) 还有从环的另一侧变小的可能。

所以直接二分答案,枚举最终 \(N(S)\), 就是看它包含了几个区间,变成了简单的数据结构。

CF338E

考虑一个一个扫面线去计算所有区间,肯定是 \(A\) 升序排序, \(B\) 降序排序然后拼起来。

套用 Hall 定理,要求变成了 \(A\) 集合必须满足一些元素都要大于等于一些限制。

如果把每个位置的限制都给他们加上 \(-1\), 加入一个元素就把他们全都加上 \(1\), 去除这个元素就删掉,要求是所有的地方都要大于等于 \(0\), 每次查询区间最小值就行了。

CF1519F

这种最优化先想怎么判合法。

假设知道了一种上锁的方案,那么方案合法就是 \(\forall{S} (\sum_{i\in S} a_i \leq \sum_{j\in N(S)} b_j), N(S)\)代表 \(S\) 内所有点上的钥匙的并集。

就是把每个宝箱拆成的 \(a_i\) 个点向所有他上锁的钥匙拆成的 \(b_i\) 个点连边,那么问题转化成了我们建的二分图存在对左侧点的最大匹配(Hall 定理逆用。

我们有一个想法 \(f_{i,S}\) 代表考虑到左侧第 \(i\) 个点,右侧的点匹配状态是 \(S\) 时候最少花费, \(S\) 是五进制数。

转移直接枚举它像谁匹配, \(a_i\) 个点要全部匹配掉,每跟一个人匹配要有 \(c_{i,j}\) 的代价。

但是这个转移可能有点慢(实际能过,我们可以类似插头Dp给一个优化,就是一个一个确定他的点去选谁而不是一下子确定。

具体的转移遍历每个锁枚举匹配几个,需要多记一个状态代表这个锁选择了几个,有可能在一个锁多次付费,但一定不如一次把他们付掉优,不影响最优解。

ARC076F

\(i\)\([1,l_i] \cup [r_i,n]\) 连边,求最大匹配。

直接使用推论5,问题变成了求 \(max(|S|-|N(S)|)\) ,考虑在 \(N(S)\) 上枚举。

假设枚举了 \(L,R\) ,就是求 \(l_i \leq L, r_i \geq R\) 的区间个数。

对于一个点作为右端点的情况,线段树上维护出所有作为左端点的值,右端点从右向左扫,变化容易维护,取max就行了。

当然还有更高庙的做法,考虑只有 \(l_i\) 的限制,那么就是把 \(l\) 排序一下之后贪心选。

现在有 \(r\) 的限制,那么我们需要的就是在 \(l\) 选择最多的情况下 \(r\) 剩下的尽量优。 (\(l\) 选择不是最多肯定不优,多选一个还能分担 \(r\) 的负担)。

什么样的 \(r\) 最优呢? 当然是小的,他的能选集合严格包含大的,在选择 \(l\) 的过程中用堆维护出这个最优的 \(r\) 集合,最后在对 \(r\) 集合走贪心 。

Undefined

\(i\)\([l_i,r_i]\) 连边,求最大匹配是否是 \(n\)

可以和上面一样的做法,同样是求当前区间的最大值,因为不合法肯定是存在至少一个区间不合法,我们只需要判断是否合法,所以对每个区间单独考虑就行了。

还有一个贪心,就是把区间按右端点升序排序,然后每次选能选择的最小的。

当前的匹配也是匹配,留给后面的点匹配也是匹配,所以当前点能匹配就匹配,可以知道选择最靠左是对后面影响最小的,这个甚至可以求出最大匹配。

ARC106E

首先二分答案 + Hall 定理,把每个人拆成 k 个点,那么就是看是否存在最大匹配。

一个关于上界的观察:答案不会大于 \(2*N*K\), 否则任意一个点的邻域都比左边所有点多,所以把每个人能匹配的点暴力表示出来。

所以每次二分答案,高维前缀和,暴力使用 Hall 定理就行了。

AGC037D

基本转化

\(D\) 变成 \(C\), 发现只需要保证每行中是它这一行 \(D\) 中元素的排列即可。

\(C\) 变成 \(B\), 发现 \(B\) 需要 在 \(C\) 中是同一行的元素要通过列上的交换变到一行上,也就是保证 \(C\) 中同一行的元素不能在相同的列上。

sol1 (爆标)

问题转化成了,给定一个 \(n*m\) 的矩阵 \(\rm A\), 再给定 \(n\) 个形如以下的限制:指定 \(m\) 个元素,要求他们不能在同一列上。

保证每个元素被指定一次,要求任意排列每一行满足限制。

继续观察性质,发现我们想要泛化问题,可以把初始给定的矩阵和操作也转化成限制,也就是初始矩阵给定的每一行元素不能在同一列上。

这样,问题就只剩下了 \(2*n\) 个限制,需要给每个元素染上 \(m\) 种颜色中的一种,使得每个限制的集合内颜色不同。

别忘了我们转化的过程中,限制并不一般,具有任意一个元素出现且仅出现在两个限制内,且存在 \(n\) 个无交的限制的并集是全集,并且这 \(n\) 个限制的补集也满足无交且并是全集。

既然可以分成两个是全集的集合,考虑建一张二分图出来,左右两部分分别是 \(n\) 个并集是全集的无交限制。

每个元素出现且仅出现在两个限制内,就把他们连一条边。

问题变成了给定一个左右分别有 \(n\) 个点的二分图,每个点有 \(m\) 条边,要求给每条边染 \(1 \sim m\) 的色,使得每个点连出的边中恰好包含 \(m\) 种颜色。

这个问题是 Vizing 定理的经典形式,直接套用其构造性证明方法,即可做到 \(O(n*nm)=O(n^3)\)code

sol2 (标算)

还有另外一种转化的方式,考虑先把 \(D\) 中同一行的元素染上一种色。

那么就是给定一个 \(n*m\) 的矩阵 \(\rm A\),每个元素被染上了一种颜色,保证一共有 \(n\) 种颜色且每种出现 \(m\) 个。

要求排列每一行,使得每列包含恰好 \(n\) 种颜色。

每行建立一个节点,每个颜色建立一个节点,每行向包含的每个颜色连包含次数条边。

这个二分图的一个完美匹配对应了一列的方案,只需要跑 \(m\) 次就可以得到 \(\rm B\) 矩阵。

问题是怎么证明这个图一定扛得住 \(m\) 个完美匹配。

还剩 \(k\) 列没选择的时候,这张图是一张 k-正则 二分图,根据 Hall 定理的推论,一定存在完美匹配。

一个无向图,每个点度数都是 \(k\) ,则称这个图为 k-正则图。

假设存在一个集合 \(S\), \(|N(S)|<|S|\), 由于 \(|S|\)\(|N(S)|\) 连了 \(|S|*k\) 条边,所以 \(N(S)\) 至少有 \(|S|*k\) 条边,但是 \(N(S)\) 只有 \(N(S)*k\) 条边,与假设矛盾,故推论成立。

summary

我们惊奇的发现,虽然从两种完全不同的角度思考,但是建出来的图竟然是完全一样的!

也就是你们不跑 \(m\) 次最大流而是直接跑 Vizing 定理也可以爆标哦~。

同时,也可以这么去理解 sol1,在这个图上找一个完美匹配,然后把他们都染上一种染色,第 \(i\) 次染第 \(i\) 种染色,因为是完美匹配,所以每个点在这种颜色都有且仅有一条边覆盖它,一定能保证每个点恰好包含 \(n\) 种颜色。

DAG最小路径覆盖题目

最大权闭合子图题目

上下界网络流题目

最小割树,最小割性质题目

题目 (最大流)

这部分的计划是把 cmd 和 ix35 的题都口胡一遍,记一些没想到的问题或者一些建图的技巧。

upd: cmd博客水题好多啊,尤其是匹配的,感觉匹配只有后面的几道有质量。

P2472 [SCOI2007] 蜥蜴

  • 点上有限制去把点拆成两个点中间连一条边为限制。

P2766 最长不下降子序列问题

发现建图的难点在于怎么让一个最大流对应一个最长不降子序列。

为了满足这一条件,我们可以按照 \(f_i\) 来分层,在最优转移之间连边

  • 不要局限与把图分成两部分,分层图技巧用来对付一些不容易满足的限制。

P2754 星际转移问题

为了满足时间的限制,考虑按照时间分层, 和上一题一样的套路。

之后为了求出这个最小时间可以考虑二分答案,比较简单。

P3163 [CQOI2014]危桥

比较牛逼的题,先咕着。

CF628F Bear and Fair Set

  • 网络流建图,如果所有的东西都有限制,那么很重要的思想是把所有的点分成不相交的集合。

考虑把限制差分,那么就变成了若干个不相交的区间内数的个数。

那么第一层放置区间的限制,第二层把点拆成边限制只能选1次,第三层放 \(\mod 5\) 的限制,直接匹配就好。

P5038 [SCOI2012]奇怪的游戏

和上一题一样的思想,分成不相交的集合。

在四联通的棋盘上,最经典划分集合的套路就是黑白染色。

之后发现每次操作都会给黑白都增加1,所以设白色有w个,和是W,黑色同理b,B

目的是求出最小的C,使得 \(wc-W==bc-B\),移项可以求出 \(b\not=w\)\(c=\frac{W-B}{w-b}\)

也就是格子有奇数个的时候,最终可能的数只有一种,我们只需要 check 他是否合法就行了。

格子有偶数个的时候,可以二分答案,因为如果 \(p\) 可行,\(1*2\) 的方格可以构造 \(p+1\) 可行。

然后直接黑色在一边,白色在一边,二分图上匹配即可。

P2570 [ZJOI2010]贪吃的老鼠

有了前面的套路,我们可以想到二分答案,把蛋糕出现的时间离散化,把老鼠分成若干个不相交的区间。

此时唯一的问题是 怎么解决不能让很多老鼠同时吃一个蛋糕。

考虑单独的一块蛋糕,他被吃的情况必定是 \(\sum_{i=1}^{n} t_i*v_i\), 分别代表吃的时间和吃的速度,其中要满足 \(\sum t_i \leq time\)

这个东西看起来就不像有高庙的建图方式可以解决的,所以考虑 转化贡献形式

考虑最终一个 \(v_i-v_{i-1}\) 的贡献,不难发现只需要 \(\leq time\) 就可以。

那么我们把每只老鼠变成排完序之后他和他上一只老鼠速度的差分,看看需要满足什么条件。

考虑一只差分后的老鼠最多吃多少, \(\sum_i v_i=\sum_i \sum_{j=1}^{i} v_j-v_{j-1} = \sum_{j}v_j-v_{j-1}*(n-i+1)\) ,在这段时间内,他最多吃 \(time*(v_i-v_{i-1})*(n-i+1)\) 的蛋糕,从原点连向它这么多流量。

他对一个蛋糕最多贡献 \(time *(v_i-v_{i-1})\) 向蛋糕连容量为它的边。

此时我们只需要判断是否满流即可,不难发现没有了 \(\sum t_i \leq time\) 的恶心限制。

一种方案的实际意义是 \(v_{i-1} \rightarrow v_{i}\) 的加速器开了多长时间,最后如果这个时间随着 \(i\) 单降,他就对应了一种合法方案,满足原题所有要求。

现在的问题就是怎么把一种 \(t_i\) 不单降的方案调整成 \(t_i\) 单降的 ,暂且存疑。

P4382 [八省联考 2018] 劈配

这题我只会一个暴力的做法,每个选手依次考虑每个志愿的导师,向这个志愿的所有导师去连边看能否增广。

注意到每次只用增广一个流量所以选择 \(EK\), 正好符合我们 "无流量不改变图的状态" 这个需求。

暴力做的话复杂度是 \(O(nm*EK)=O(nm*nC)\) ,有点高,但不难发现我们可以二分他能被哪个志愿入取,之后看增广前缀的导师能否增广,可以优化到 \(O(nlog_2m*nC)\)

第二问我们可以保留每个前缀的残量网络,二分答案看在一个前缀的导师里看能否增广,复杂度 \(O(nlog_2n*nC)\)

正解比较厉害,先考虑第一问。

在每个人,如果我们可以快速判断哪些导师可以增广,求出他被第几志愿入取,那么我们只需要付出 \(n*nC\) 的代价在每次成功的时候增广一次。

挖掘一下你能向他这个点增广的条件:你到他的边是你连的,所以他到汇点有增广路就可以了。

向汇点有增广路? 直接从汇点在残量网络的反图上 dfs 一遍,能到达的点都可以增广到汇点。

那么每个人只需要 dfs 一次,增广一次,复杂度 \(O(n*nC+n*EK)=O(n^2C)\)

第二问同理, 先把每个前缀 dfs 一次的结果处理出来,每个人二分答案看前 \(s_i\) 有没有能到达的点就行,复杂度 \(O(n^2C+nlog_2n)\)

CF793G Oleg and chess

只想到了主席树优化建图,点边都是 \(nlog_2n\) 的,比较显然,每个点维护一个值和懒标记代表他是否应该和他的父亲连边。

我们想要优化这个东西,不放观察一下性质:矩形不相交

给出一个结论:矩形不相交的时候,用 ODT 维护连续段进行极大的矩形划分,最大划分成 \(O(n)\) 的矩形。

考虑 ODT 对答案的贡献就不难知道:左边界让连续段+1,答案+1,右边界让连续段-1,答案+2,最后答案+=连续段。

然后就可以区间向区间连边,点数变成了 \(O(n)\) ,边数还是 \(O(nlogn)\) 的,网络流可以跑过。

  • 优化建图不要忘记有区间向区间连边这个操作。

如果矩形相交,最多能划分出来多少个?发现答案和连续段是平衡(一加一减)的,还是 \(O(n)\) 个。

这题其实并不难写,感觉写代码有点亏, code, 但自己为什么从来写不对网络流?以后还要多写几个。

CF212A Privatization

Vizing 定理模板题吧,Here to learn

当然拆完点之后跑若干次最大匹配每次把它染成一个色也是没问题的。

题目 (最小割)

P2774 方格取数问题, P3355 骑士共存问题, P5030 长脖子鹿放置

很套路的二选一模型。

根据最大流里面就有的分成若干个不相交集合的套路,我们分别可以通过 黑白染色, \((x+y)\%4\) 染色 去划分集合。

然后就是两个集合内,有一些元素存在限制,不能同时选择。

如果两个元素不能同时选,就在他们之间连一条 Inf 边。

题目分别向原点汇点连 权值 的边,那么割掉的意义就是不选择他,连边 Inf 的意义就是两边必须有一个割掉。

  • 扩展一下,多选一模型

也就是我们可以通过观察把全集划分成若干个不相交的集合 \(\{T_1,T_2,...,T_{i}\}\),然后每个元素有一个权值。

题目里给了若干个限制,要求 \(\{S\}\) 集合的数不能同时被选,每个 \(T_i\) 内恰好有一个 \(\{S\}\) 里的数。

这个时候要求你选出来权值之和最大的集合。

假设有三层,如下图所示建图

img

\(\{S\}\) 集合不能同时一块选,就把他们之间串联上,中间层的点拆开连自己权值,串联边用 Inf 。

费用流题目

模拟费用流题目

posted @ 2022-07-04 20:44  Soresen  阅读(66)  评论(0编辑  收藏  举报