省选集训 Day 3

学习了新知识:边三连通,耳分解,双极定向

下面是一些基础练习。

link

A

挺不错的问题。

考虑将一个点作为 G0,一个个加入耳来构造边双连通图。

容易设计 fS 并枚举子集转移,复杂度 O(3nn2) 左右。

太劣了,考虑将拼耳的过程纳入 DP。

fS,j,k 为当前图已经填入了 S 的点,当前在填一个耳,填到了 j,目标为 k

我们发现有重边的问题,而有可能使用两条边,所以记录次短边,最短边,不妨再加一维 0/1 表示能否直接连回去,使用最短边。

转移分为以下情况:

  1. 直接连回去
  2. 新开一个耳(枚举从哪个点走,走到外面哪个点,最终走到哪里)
  3. 再走一步

B

神奇题目。

首先注意到一个大连通块可以删去 dfs 树上的叶子,因此不妨假设 ABC,我们只需要让 A,B 所代表连通块连通即可。

那么就会有 AB<n2

考虑树的情况,我们以重心为根, 将一整颗 szA 的子树划给它,然后其余划给 B,删叶子即可完成构造。

也就是找到一条边,满足断开后两个 sz 较小的 A,较大的 B,一个合理的构造是重心为根的最大儿子。

现在变成了一般图,考虑推广到 dfs 树上。

取 dfs 树重心,如果符合树的情况可以直接构造,否则考虑 dfs 树上过重心的返祖边,它们本质上是把各个子树连接在一起,在即使删掉重心之后,考虑删掉重心,构造出 A 所需点集,然后将剩下的给到 B

将重心的各个儿子(包括根方向)看作一个点,根据返祖边判断连通性,由于只会与子树外相连,所以这个连通块唯一,我们逐个扫描这个连通块的点并累加 siz,如果加满了都不足 A 说明必然无解啊,否则在第一次加满时立刻退出,设当前加了 s,那么 s2A,因此 ns2B

那么剩下的也可以构造了。

C

一个自然的想法是建立圆方树,根据双极定向的结论,我们相当于是要选出一条方点链,然后需要在之后把这些方点链当一个点处理(也就是说,根据双极定向的要求,各个方点下面接的必须是一个“点”,而在目前是一个连通块,需要将一个连通块看作一个点)

那么就是删掉方点,然后将剩下的连通块缩成一个点,接着建立缩点后的原始图,此时原始图是可双极定向的,做双极定向划分各个点集的顺序。


那么现在我们的问题就是变成了如何找到最优的链。

考虑 dp,设 fu 为圆方树 u 子树,u 在链上时的最小 max|V|

转移和计算其作为路径 lca 的贡献?

先来看转移,我们枚举链下面那个点 v 有:

  1. fu=minvmax(fv,maxv0Son(u),v0vszv0),当 u 是方点
  2. fu=minvmax(fv,v0Son(u),v0vszv0+1)u 是圆点

注意到 x,fxszx,所以在情况 1. v 必然是重儿子,在情况 2. 其实同样是这样的(如果 v 不是重儿子,那么一定是 取较大值,与让 v 成为重儿子相比一定不优)

再来看计算答案:

  1. res=minv0,v1(max{fv1,fv0,nszu,maxvv0,v1,vSon(u)szv}),当 u 是方点
  2. res=minv0,v1(max{fv0,fv1,nszu+vv0,v1,vSon(u)szv}),当 u 是圆点。

同样地,是否有 DP 计算类似的,必然取重儿子和次重儿子?

事实上确实是这样的,方点时易证,圆点时,同样地,如果 v0,v1 取不到重儿子,那么一定是取后面的 ,这一定大于将其一替换为重儿子后的权值(因为加上了重儿子 sz ),类似地,取了重儿子不取次重儿子也可以类似描述。


由这个 dp,我们还知道了决策点一定是重儿子和次重儿子,因此便可以直接提取出方点链,并双极定向求解了。

D

边三连通分量板子,略去。

E

与 A 是同质化问题,这里省略。

F

涉及混合图结论

混合图 G 能被定向为强连通图当且仅当满足:

  1. 所有边看作无向边后边双连通
  2. 将无向边看作两条有向边后强连通

某一条无向边一定存在一种定向让其定向后仍然满足这两个性质,所以可以直接枚举判断。

O(n2)

G

双极定向的练习题

考虑到,我们所选的点有什么特征?先建立圆方树。

首先判掉 n=1 以及原图点双连通的情况,这时候直接取最小值作为端点跑双极定向即可。

由于原题存在类似于双极定向的要求(后缀),因此有唯一最终点,我们将其反着看可以推出如下信息:作为起始点,需要这个点双内部仅有一个割点,并且对于所有这样的点双,有一个作为最终到达的点,其余全部需要当作起始点。

因此我们贪心地,求出每个这样的起始点双里的非割点最小点权,并舍弃最大的那一个,让它作为终点。

这样就得到了选择初始点的方案,然后考虑怎么得到答案呢?可以通过双极定向的方法,从终点开始往回走,对每个走到的点双做双极定向,然后就类似于 St->Ed 这类。

也就是最开始确定终点,终点往其所在点双的割点做双极定向,然后现在就已经走出去了,对于一个走入的割点,同样地往其所在的所有未走过的点双重复找新的割点做双极定向。

需要注意的是其他割点怎么办呢?其实是容易的,这是一个类似于递归的过程,按照双极定向走出的顺序访问这个点双内的其他割点,并递归处理即可。

回溯时就可以输出方案了。

posted @   spdarkle  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示