【笔记】图论选讲:网络流、连通性、欧拉路

[CF1082G] Petya and Graph(最小割)

强制保留所有边。对原图所有点和边都建图,对于 \(e=(u, v)\),连边 \(S\to u, S\to v\) 流量上限是这两个点的点权,\(u\to e, v\to e\) 流量上限 \(+\infty\)\(e\to T\) 流量上限是 \(e\) 的权值。跑最小割。正确性由连通性意义发现。

[CF1383F] Special Edges(最小割)

改成最小割,先 \(O(2^k)\) 地枚举应该割掉的边集,应该割掉的边权设为 \(0\),不应该割掉的边权设为 \(+\infty\)(这里只需要看割的意义)。询问也同样枚举。

优化是因为 \(w\leq 25\) 的限制,一开始枚举的时候先钦定所有特殊边都割断,枚举集合时做增流的步骤。

[ARC156F] Make Same Set(匹配)

直接网络流,从源点 \(S\) 出发,连 \(S\to \{1, 2, \cdots, n\}\) 表示选 \(a_i\)\(b_i\),第 \(i\) 个点连向权值 \(a_i, b_i\) 对应的点,每个权值自己拆一次点确保流量为 \(1\);然后另一批 \(\{1, 2, \cdots, n\}\to T\) 表示选 \(a_i\)\(c_i\),反着连回去它对应的权值。

会不会有问题呢,不会。你考虑那些没有流量的点。称一个点为空点,当且仅当它连出去的两条边都没有匹配,它是严重不合法的。实点就是相反。考虑一个空点变为实点以后不会再变回去?因为变回去的时候反悔到那里就不是最短路了,有个更近的从实点过来走两步的流,它是个假的流。所以一开始强制所有 \(A_i\) 流掉再进行 dinic,因为这样全是实点,且 dinic 每次增广都是最短路,就对了。\(O(n\sqrt n)\)

[AGC031E] Snuke the Phantom Thief(匹配)

枚举选多少个点,将限制变成对范围外第一个单点的限制,那么最终横坐标第 \(i\) 小、纵坐标第 \(i\) 小的就会有一个区间限制。做一遍 chkmin & chkmax 的工作后,单调性可以忽略,可以用 mcmf 做匹配(注意横坐标纵坐标的限制是分别排序后的,一个点可以是横坐标第 \(i\) 小同时是纵坐标第 \(j\) 小)。

[AGC029F] Construction of a tree(匹配)

首先做二分图匹配,从每个集合里面选出这个集合对应的一个儿子。那么要么匹配不上 \(n-1\) 个点,要么剩下一个点,我们就钦定为根,从根开始 dfs,选出它的所有儿子,递归下去。

如果发现没匹配完,说明有不连通的部分,这部分的点数等于边数,也就寄了。

[Gym102201J] Jealous Teachers(匹配)

首尔科学高中有 \(N\) 名教师和 \(N\) 名学生。每个学生购买了 \(N\) 朵花,因为明天是韩国的教师节。然而,其中一名学生退学了,现在学校只剩下 \(N-1\) 名学生。每位教师应该收到正好 \(N-1\) 朵花。学生只能将花送给教过他们的教师,而你知道哪些学生是从哪些教师那里学习的。永勋是首尔科学高中的学生,他需要你的帮助来组织这个活动。

\(2 \le N \le 100 000\)\(1 \le M \le 200 000\) 并要求构造方案或无解。

先找一个匹配,将所有匹配的边流满,这样会多出学生到某些老师的 \(n-1\) 流量的反悔边,并有 \(n-1\) 个老师的边会断掉(到源点的流量没有意义),所有学生只剩下一个流量,只有一个老师有 \(n-1\) 流量。

这意味着这一位老师需要将流量送给每一个学生。因为中间的边流量为 \(n-1\),已经是最大流量了,老师可以随意经过而无限制。那么我们看一下图是否连通就好了。

[ECF2022K] Magic(匹配-独立集)

对于两个相交不包含的区间 \(l_1<l_2<r_1<r_2\)\(l_2\)\(r_1\) 的答案只能留下一个。可以给这两个端点连边,刚好有左右端点之分,是二分图,获得其最大独立集即可。

可以发现,答案不会比最大独立集大。同时也可以发现最大独立集不会比答案大,因为我们一定能通过拓扑排序获得操作方案:拓扑排序过程中,区间的左端点会逐渐右移(或者逐渐左移),不会出现环。

对于包含的区间:反正不需要求方案,不需要与被包含的区间做任何事情。

[CCPCF2022H] This is not an Abnormal Team!(匹配)

有一张二分图,请将它划分为大小为 \(1\sim 3\) 的连通块,满足

  • 大小为 \(1\) 的连通块尽量少。
  • 在此基础上,大小为 \(3\) 的连通块尽量少。

\(n\leq 10^5, m\leq 2\times 10^5\)

跑一个最大匹配,那么一个连通块内未匹配的点一定全在左侧或右侧(否则存在增广路)。以左侧为例,将所有匹配上的边 \((u\to v)\) 连边 \(u\to T\) 边权为 \(1\),未匹配的左侧点 \(u\) 连边 \(S\to u\) 边权为 \(1\)。原来的反悔边保留,跑最大流。可以发现一个流会伴随着若干匹配的改变和一个大小为 \(3\) 的连通块的出现,总之是合情合理的。

注意这题不是求最小边覆盖!

[CF1630F] Making It Bipartite(最小割-切糕)

题目条件即为不能出现 \(a|b\land b|c\)。如果只是 \(a|b\),那么是最长反链。

有一个与切糕类似的做法,我们将 \(a|b\) 的关系拆成四个点三条边 \(a_1\to a_2\to b_1\to b_2\),并希望给每个点标一个 \(0\sim 2\) 的标号,满足 \(a_2=a_1\)(删去)或 \(a_2=a_1+1\)(保留),\(b_1=a_2\)。为了连更多的边我们将限制改为:

  • \(a_2\leq b_1\) 是钦定的。
  • \(a_1+1\leq a_2\) 则支付 \(0\) 的代价,否则支付 \(1\) 的代价。

套用切糕模型,求出最小割,最小割即为删去点的数量。

[CF786E] ALT(最小割)

这题是诈骗的,直接变成居民向路径上的所有守卫连边,要么选居民,要么选一堆守卫。任意数据结构优化建图。

[Gym103855I] Marbles(上下界)

两个袋子 \(u, v\) 合并,将它们以 \([0, \infty)\) 边连向新袋子即可。观察到袋子 \(u\) 的红色珠子数量在 \([l, r]\) 之间,我们向一个新的袋子连一条流量 \([l, r]\) 的边,表示我现在限制它一下。丢掉一个珠子,我们从它所在的袋子向它连一条 \([0, 1]\) 的边,表示我丢掉它,流量送回去。最后统一将所有珠子丢掉。

为什么要这样做呢,因为这样就发现从每个珠子出发有一个回到它自己的圈(环),而且流量因为最后一条边限制是 \([0, 1]\)。如果确认它是红色,那么将这个圈流一个流量,否则不流。这样我们就只需要求上下界可行流了。

*[NOI2022] 二次整数规划问题(最小割-切糕)

定理:值域为 \(n\) 的非负整数点构成的凸包点数上界为 \(O(n^{2/3})\)

[AGC059C] Guessing Permutation for as Long as Possible(2-sat)

这个东西十分智障,只需要对于所有 \(a, b, c\),如果询问顺序是 \((a, b), (b, c), (a, c)\),那么不能 \(a<b<c\)\(a>b>c\)。其它的情况(一条链)你一看发现肯定需要出现上述情况,那么这就是充要条件。

你一看你直接对所有询问当作 2-sat 的变量去拆点就能连出来一张无向图,既然是无向图那么连 2-sat 都不用,直接是一个并查集题目。最终答案 \(2^{block/2}\) 其中 \(block\) 是连通块数量,连通块一定是对称的。另外根据我们的过程,一定不会有环。

[CF587D] Duff in Mafia(2-sat)

这一题的限制超强。对于一个点,你最多只能破坏一条与之相连的边,且同一个点上的同色边不能超过两条,如果有两条同色边则它们必须破坏一条。这就太离谱了,读到这里已经可以前后缀优化 2-sat 建图了(可能还要写个二分)。然而因为同一个点上的同色边不能超过两条,所以你还能发现同色中一定是一堆环和链,环比较简单,链有一个链头可能要和其它人分讨,也是 2-sat 解决的。

[CF1137C] Museums Tour(SCC)

分层图,缩点。你发现城市 \(x\) 的周 \(a\) 与城市 \(x\) 的周 \(b\) 这两个状态不可能出现:它们不在同一 SCC,但是前者能走到后者。因为既然已经能走回城市 \(x\) 的周 \(b\) 了,那么你再重复走 \(d-1\) 轮就能回去周 \(a\) 了。于是就变成 DAG 上 DP。

无标题(SCC)

有⼀张 \(n\) 个点的图,初始没有边。

接下来有 \(m\) 条有向边依次加入图中,保证没有自环,且任意 \(i,j\) 间最多有⼀条边。

每次加入之后,查询如果我们在图中添加⼀些边使得图构成竞赛图,其强连通分量个数的最小值。

\(n\leq 2\times 10^5, m\leq 2\times 10^6\)

定理:补图上的连通块可以定向成为强连通分量,除非其大小为 \(2\)

证明:考虑随意定向,此时是竞赛图,其缩点后为一条链。考虑最后一个 SCC,因为补图是连通的,所以它肯定有一条边往回连了,可以反向之,然后递归下去,可以证明原结论。

所以可以先算 \(m\) 条边的答案,反复缩点缩成竞赛图(可能有 SCC 的大小为 \(2\) 要记下)。往前处理询问时,相当于补图上加边,那就能把一个区间的 SCC 缩起来了。

[IOI2019] 景点划分(dfs 树)

钦定 \(a\leq b\leq c\)。想象一棵树怎么做,我们只需要找出重心,如果它有 \(\geq a\) 的子树就做完了;如果没有,则我们必须要选中重心,但因为所有子树 \(<a\),我们选中重心就再也选不出 \(\geq b\) 的子树了,导致无解。

对于一般图,随机求 dfs 树,求出其重心,如果它有 \(\geq a\) 的子树就做完了。如果没有,考虑这么一个东西,因为 dfs 没有横叉边,这个重心的子树只可能往它头上有连边。维护点集 \(S\),先将重心头上的点加入 \(S\),再考虑重心的子树,如果有往上跨过重心的返祖边则也加入 \(S\),直到 \(|S|\geq a\) 时就有解了。

证明:我们其实是在合并子树,显见,直到有解的时候,\(|S|<2a\),推出剩下的点有 \(\geq n-2a\) 个,而因为 \(b\leq (n-a)/2\)\(a\leq n/3\),后者推出 \(n-a\leq 2n-4a\),所以 $ b\leq (n-a)/2\leq n-2a\leq $ 剩余点数,因此可以选出这个 \(b\)

\(|S|\) 无法 \(\geq a\) 时,实际上我们发现这已经和树的情况一致了。

[UNR #5] 获奖名单(欧拉路)

这个东西的核心是将其看作从两端向中间匹配。建出 \(m+1\) 个点,第 \(0\) 个点表示现在左右两端已经匹配,第 \(i\) 个点表示有一端多了一个字符 \(i\)。对于单字符 \(a\),就是 \(0\)\(a\) 连无向边;对于 \(a, b\),就是 \(a, b\) 连无向边,显然。根据总长度是偶数还是奇数,确定走欧拉路径还是欧拉回路。

一个细节问题:从匹配好的状态加两个字符,和它匹配的一定是和他一样的东西,用不到它当且仅当它与 \(0\) 点不连通。那就看一下是否都是重边就好了。

*[清华集训2017] 无限之环

*[NOI2017] 游戏

*[QOJ3301] Economic One-way Roads(耳分解)

*[QOJ8056] Travel 2(dfs 树)

posted @ 2024-07-30 11:35  caijianhong  阅读(4)  评论(0编辑  收藏  举报