换根dp

换根dp

 
 

背景

对于一颗无根树而言,假如我们有着把每个节点当成根节点的需求时,那么原先的直接从根节点开始搜索就无法满足我们的时间效率
此时我们就需要考虑转换策略研究,有没有什么好的方法能够不去把每个节点当成根节点都跑一次搜索
考虑我们手中已有的信息,我们知道跑一次搜索能得到一个根节点(u)所要的答案,那么我们就想着能不能试着通过这个答案去得到其他节点为根节点时的答案
首先我们将考虑的其他节点理解为和u关系近的节点也就是u的所有直连节点,这样的话更容易能产生联系
我们将与u直连的节点中的一个命名为v,我们来试着研究一下u、v的关系
先分析一下无根树的定义: n个节点,n-1条边,任意两个节点之间有且只有一条简单路径的无向无环连通图
我们通过这个定义能得到一个隐含条件,设u到所有点所要经过的边数为deepi\(i \in all point\),那么我们通过u的得到v到所有点要经过的边数
v能到的点分为两种,一种是得经过u才能到达,另一种是不需要经过u就能到达,v到第一种点的距离就是deepi+1 \(i\in经过u\),v到第二种点的距离是deepi-1 \(i\in不经过u\)
通过这一性质的发掘使得我们找到了u、v的联系

 
 

基本模型

跑两次dfs,第一次预处理诸如深度,点权和之类的信息
第二进行换根的状态转移

例题:

posted @ 2024-04-17 16:10  独陷泥沼  阅读(50)  评论(0)    收藏  举报