图论1(许廷强)

\(\text{图论1(许廷强)}\)

A

没有 A 题,因为 A 题实际上是教练放错题的产物。

B CF1239E Turtle

题目的关键是没有入手点时去发现一些有趣的小性质,不妨胡诌一些特殊的结论再考虑证明,而在最值问题上这些结论往往是和单调性强相关的。那么这个题实际上是观察性质题。我们记第一行形成的序列为 \(a\),第二行形成的序列为 \(b\)。下面是这个题需要的三个小性质:

  • 为了得到最小值,\(a\) 序列需要递增。原因是假设 \(a_i>a_{i+1}\),那么对于在 \(i+1\) 处及以后的贡献无影响,但是交换会使得其在 \(i\) 处的贡献减小。同理,\(b\) 序列要递减。

  • 两个最小值一定分别在起点、终点。这个是显然的,因为无论如何交换都无法更优。

  • 最优转折点一定是 \(1\)\(n\)。考虑对于两个点 \(i,i+1\),如果 \(i+1\) 更优,由第一条的性质可以得到推得的是 \(i+2\)\(i+1\) 更优;当 \(i\) 更优的时候是相反的。

那么问题变得好解决得多了,转化为了简单的背包问题。这样一来用 std::bitset 优化转移背包就能过了。

C CF521E Cycling City

图上的问题我们一般拿到生成树上来做。考虑到 DFS 树没有横叉边的优良性质,先构建出一棵 DFS 树。考虑转化题意。发现三条不交的简单路径等价于两个有公共树边的环,那么问题的关键就是找到被非树边覆盖过至少两次的树边。由于只要被覆盖两次就停止,于是直接暴力去覆盖的复杂度是对的。这样一来就能找到两条非树边的起止点,略微分类讨论一下输出方案即可。

D CF1142E Pink Floyd

这个粉色边的限制就很 SB,考虑先不管其限制将其去掉,考虑只有绿色边的情形。对于一个竞赛图,通常的解决办法是将其缩点后成为一个链的形态,那么我们要找的实际上就是缩点后的 DAG 拓扑序最小的那个点,而这个点我们可以认为其没有出边,如果有出边也一定是在自己这个连通分量内,显然这个连通分量内所有点都是符合情况的。因而我们维护一个 "不可达点" 的集合,每次在这个集合中任意选择两个点询问方向,将拓扑序较大的点剔除出集合,重复 \(n-1\) 轮,不难看出最后剩下的点是合法的。

考虑加入粉边这个 SB 的限制。注意到我们这样做的本质是去剔除掉那些一定更不优的点,那么对于粉边内部这样的点剔除这一方式同样是有效的。于是我们先将粉色点集合缩成一个有向生成树。注意到对于粉色集合内部拓扑序较大的点无需与拓扑序较小的点进行判断,难以判断的是粉点内部拓扑序较大走向较小的情形,那我们不妨将粉色点分层加入处理,这样一来实际意义对于每一层粉点分别处理和其它所有绿点的情形。绿色点之间的贡献答案我们自然可以轻易判断,现在我们对于每一层的粉色点分层处理相当于是将当前的粉点与之前判断过其余可以到达拓扑序更小粉点的绿点来进行操作,自然不用处理拓扑序更大的粉点的情况。这样一来遵从了所有的限制,也没有漏解。

E CF611H New Year and Forgotten Tree

相当有意思的一个题。考虑所有位数相同的点等价,不如把所有位数相同的点看成一类点,再考虑构造方案。考虑树的特点是除了根节点外点和边一一匹配,我们不妨着眼于一一匹配点和父亲边。这样一来我们要解决的是匹配问题,不妨每次暴力枚举每条边检查能否删去,于是问题的核心变为如何检查一种状态是否一定有合法的构造方案。考虑解决匹配问题是否有解使用的是 Hall 定理,于是判定的时候只需要检查所有子集中边树是否严格小于点数即可。

F CF1305G Kuroni and Antihype

容易发现的是每个人补集的子集就是这个人可以达到的势力范围,这样一来所有朋友关系的个数是 \(3^{18}\) 级别的。考虑将选人这个抽象的操作具象化,我们将选人的过程建成一个有向图,那么容易想到的是加入一个权值为 \(0\) 的虚点表示初始情况,那么现在就是要求一棵有向图的最大生成树。这个有向图我们不好处理,考虑到原图边权实际上是 \(a_x+a_y\),生成树中每个点也只会有一条入边,换句话说我们将边权直接看为 \(a_i+a_j\),最后将答案减去 \(\sum a_i\),不难发现这样转化是正确的。

G ARC103F Distance Sums

由于 \(d_i\) 互不相同,不难发现 \(d_i\) 取最小的点一定是重心。那么以重心为根节点建树,不难发现的是 \(d_{fa(x)}-d_{x}=2\times siz_x-n\), 由于以重心为根,\(siz_x<\dfrac n2\),换句话说 \(d_i\) 在树中是递增的。

这样一来就按照 \(d\) 的单调性来处理。若从上而下,由于 \(siz_x\) 不知,不好处理;但从下而上递推却显然是唯一的。最终从根节点 DFS 一遍检验根节点是否合法即可。

H AGC025E Walking on a Tree

这个题还是相当有意思的,记 \((x,fa_x)\) 的经过次数是 \(c_x\)

首先考虑答案的取值。注意到如果每条路径有公共部分就连上一条边,那么最后所有边构成的图是可以构成一棵树的形态的,那么容易贪心将答案取到上界 \(\sum\min(2,c_i)\)

考虑直接将边连起来这个形式比较难处理,不妨转化到每个点上去处理贡献。答案取到最大值意味着每个点的 \(c_i\) 要取满。这样在树上处理贡献一般是自下而上的。那么现在来分类讨论处理:

  • \(c_i=0\):无须处理。
  • \(c_i=1\):将 \((x,y)\) 的边改为 \((fa_x,y)\) 加入。
  • \(c_i=2\):这里的处理比较巧妙。先任意取出两条边 \((x,y),(x,z)\),钦定这两条边是一正一反,那么事实上相当于加入了一条 \((y,z)\) 的双向边,于是继续向上处理就可以了。实现是有一些 SB 细节的。

I AGC033F Adding Edges

这个 \(a,b,c\) 没有钦定顺序就很 JB 烦人,考虑让 \(a,b,c\) 钦定顺序,换句话说对于顺次的 \(a,b,c\) 三点,形成的三条边中任意有两条边的效果显然都是等价的。那么我们考虑将所有边转化为等价的顺次相连的边的形式。那么我们考虑设一个辅助数组 \(t(x,y)\) 表示 \(x\) 为根时中 \(y\) 节点最近的和 \(x\) 有直接连边的点。这样一来我们分类讨论一下:

  • \(t(x,y)=y\):那么 \((x,y)\) 是无效加边。

  • \(t(x,y)\neq 0\):对于 \((x,y)\) 的连边是可以转化到 \((t(x,y),y)\) 上去的。

  • \(t(x,y)=0\)\((x,y)\) 是需要加入的,同时还要更新 \(y\) 子树内 \(t\) 的值。

然后统计答案是容易的,在新图上枚举根节点后进行遍历就行了。

J P4249 [WC2007] 剪刀石头布

统计三元环这个东西是极为困难的,正难则反,考虑总的可能三元环个数是 \(\dfrac{n(n-1)(n-2)}6\),那么考虑统计不合法的点对个数。容易发现的是不合法的情形会且仅会有一个点恰好有两条出边,那么设点 \(i\) 的出边个数是 \(d_i\),那么 \(ans=\sum\dbinom{d_i}{2}\)。这个式子是相当好统计的。考虑多加一条边答案的增量变化是 \(i-1\),那么是一个显然的费用流模型,输出答案直接在残量网络上跑一跑就行了。

K CF1338E JYPnation

竞赛图首先先进行缩点。直接做显然不好做,考虑去发现一些奇妙的性质。

  • 缩点后形成的连通分量链里,只有链末尾的那个连通分量可能有多个点。

这一点是显然的,考虑一个连通分量里的所有点都必定会有和下一个连通分量里所有点的连边,一定无法满足限制。

  • \(dis(i,j)\le 3\)

对于 \(i,j\) 不在同一连通分量里的情形,这一点是显然的。考虑 \(i,j\) 在同一连通分量里的情形,手玩一下是不难得出这一结论的。

那么现在的问题转化为了找在一个满足题目所述性质的竞赛图中,\(dis(i,j)\)\(1,2,3\) 的点对的数量。\(dis(i,j)=1\) 好求,显然求 \(dis(i,j)=2\) 更为方便,答案为 \(3\) 的情形也是可以求得的。直接暴力做是 \(O(n^3)\) 的。考虑对于 \(dis(x,y)=2\),必有 \(y\to x\)\(x\to a\to y\)。那么 \(x,a,y\) 实际上形成了三元环,那么利用一下这个性质:对于有 \(x\to b\) 的点 \(b\),若有 \(a\to b\),由于题目性质必然没有 \(y\to b\),换句话说一定会有 \(b\to y\),于是 \(b\) 点也可以作为合法的中转点。也就是说,我们把 \(x\) 的出点集合拎出来,只需要找到这个集合里拓扑序最小的点检验合法与否即可。

L UOJ670 获奖名单

难以找出一种靠谱的构造方法。那么先考虑弱化的情形即长度为偶数且中间没有字符串跨过中心的情形。那么将后一半回文串翻过来就会发现前后是一一对应的。画出来之后发现有这么两种情形:

  • 两个字符与两个字符直接匹配。
  • 两边分别以一个字符开头和结尾,中间用一堆两个字符的串串起来。

那么考虑构建图论模型解决这个问题。第一种情形在最后可以直接判掉,第二种情形由于都是以一个字符的进行开头和结尾,不妨开一个虚点连接所有一个字符的情形,然后我们就会发现一组合法的解正好对应一个欧拉回路。

对于一般的情形,当中心有字符串时也一定是一个两个字符相同的字符串。当长度为奇数时,总会多出一个节点匹配不上,那么事实上就是跑一个欧拉路径。

代码比较难写。

M UOJ605 知识网络

标签这个限制很好,让我们从标签这个东西里发现一些性质。考虑到对于属于同一标签的点 \(x,y\),满足任何 \(i\) 都有 \(|dis(i,x)-dis(i,y)|\le 1\)。我们不妨将标签里的所有点看成一个大点,跑出这个大点到外部所有点的最短路。那么现在的问题转化为了对于标签内的点 \(i\),外部的点 \(x\),最短路为 \(d\)\(dis(i,x)\) 是取 \(d\) 还是 \(d+1\)。不难发现的是当且仅当 \(i\)\(x\) 有不依赖 \(i\) 这个标签,有直接可达的最短路时取 \(d\),那么建出最短路图 DAG,用传递闭包可以解决这个问题,上 std::bitset 优化一下即可。注意由于空间问题,需要用 bitset 分块这个常见的套路。

代码还是很难写。

N UOJ32 跳蚤公路

比较有意思的一道题。我们会发现负环这个东西并没有什么好方法来判定。似乎唯一沾边的是 Bellman-Ford 可以进行负环的判定。在 Bellman-Ford 中是设 \(f_{i,x}\) 表示从 \(1\)\(x\) 走最多 \(i\) 步下的最短路,有 \(f_{n,x}<f_{n-1,x}\) 证明有负环。对于本题,不难发现的是对于每个环的权值都可以写成 \(kx+b\) 的形式。那么只需要考虑简单环就可以统计所有情况。那么 \(k\) 很小,当我们固定 \(k\) 时就只需要考虑 \(b\) 了。那么我们不妨设 \(f_{i,x,k}\) 表示从 \(1\)\(x\) 最多走 \(i\) 步,此时斜率为 \(k\) 时的最小的 \(b\)\(f\) 数组是可以简单求出的。那么考虑存在负环的条件就是 \(\min_p\{px+f_{n,x,p}\}<\min_q\{qx+f_{n-1,x,q}\}\)。将右边的式子拆开,是一个不等式组的形式,要求的是并集。由于在一个 \(p\) 的意义下每个不等式都会贡献且仅贡献一个形如 \(x>a\)\(x<a\) 的式子,在一个 \(p\) 的意义里要么不存在负环的可能,要么存在的区间是一段 \([l,r]\)。对于答案的统计,注意在图上负环是有传递性的,换句话说 \(x\) 的限制要传到 \(x\) 的所有后继。要统计有负环的部分那就转化为了一个线段求交的问题,这是容易的。

代码细节有点多,有点难写。

posted @ 2025-05-12 21:41  长安19路  阅读(29)  评论(0)    收藏  举报