【模板】【luogu P4630】Duathlon 铁人两项(圆方树)
Duathlon 铁人两项
题目链接:luogu P4630
题目大意
给你一个无向图,然后你可以按顺序选三个点 a,b,c,保证 a 可以到 b,b 可以到 c,而且存在方案使得这两个路径的交点只有 b。
然后问你有多少个满足的三元组。
思路
首先如果这个是森林的话那我们可以很好的搞。
(反正各种方法随便你)
那我们现在是一个图,那就不好搞了。
那我们考虑能不能把它变成树?于是就可以用圆方树了。
圆方树
在讲圆方树之前,让我们先给出一些定义:
点双连通图
如果是有向图,就有一个强连通图。那无向图就会有一个点双连通图和一个边双连通图。
边双连通子图这里没用到就不说了,我们给出点双连通的子图的定义:图中任意两不同点之间都有至少两条点不重复的路径。
(因为一个点的比较不好搞所以我们默认没有孤立点,如果题目中有就按照题目要求特殊处理)
然后你会发现有一个近似等价的定义是不存在割点的图。
发现反例只有两个点一条边的情况(或者你也可以认为不是反例,因为你起点终点一定要重复的)
点双连通分量
跟强连通分量一样,就是一个图的极大点双连通子图。
但是你如果画个图你不难发现就是一个点是可能在若干个点双中的,但是一个边只会在一个中。
圆方树
那在圆方树中,我们把原来的点看做原点,每个点双对应一个方点。
(不难看出方点数量最多为 ,所以记得总共要开 )
然后一个方点向它点双里面的点(原点)连边。
然后这个图就变成了若干格菊花,每个菊花通过原图的割点连接起来。
然后你不难想象任意一套树上路径都是圆方点交错的。
建
考虑用类似 Tarjan 的方法。
那因为无向图,所以我们找到新点的时候更新 是跟 更新,找到原来的点的时候就要跟 更新。
那你会发现也是找环的顶端,那条件就是 (然后 就是最顶端)
然后你就可以建出来了。
这道题
那如果是树上的很好搞,我们考虑把环通过圆方树弄成树,然后看看方点那边要怎么处理。
然后我们其实会发现你一个点双里面任意两个点之间,对于其他的每个点都有一种方法可以走过。
(小小证明就是你可以把这个点双拉成一个环,然后就没啦)
然后你就发现如果你要经过一个方点,你里面的点都可以经过,那我们可以把方点的权值赋做它点双的大小,然后路径上的方点的权值和就是固定了 满足条件的 的个数。
然后你发现你算重了,因为相邻的两个方点之间是通过点连接起来的,所以每个点其实都会充当一个连接的位置,所以我们要把点的权值弄成 。
然后这里是要求所有的,我们就小小树形 DP 一下,考虑每个点对所有包含他的路径的贡献即可。
(子树内部,子树和外面)
代码
__EOF__

本文链接:https://www.cnblogs.com/Sakura-TJH/p/luogu_P4630.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
2021-07-03 【ybt金牌导航6-1-3】圈套问题
2021-07-03 【ybt金牌导航6-1-2】向量问题