换根dp

 


引入

Problem

现在有一个无根树,要你确定一个根,使得其他点到这个根的距离最短。n105

Solution

Thinking 1

枚举根,dfs暴力求距离,取最大值,时间复杂度O(n2)

Thinking 2

如果让根的子树变成根,那个树的形态其实很多都没变!如果再来一次O(n)的话,太浪费了!
我们考虑先选一个根节点(默认为1),然后dfs子树来更新。


假设我们现在已经通过第一次dfs算出了dp[1](以1为根的答案),来求dp[2]。不难发现,2A的深度都相比一开始减1,那么对答案的贡献就是减子树的大小,即siz[2],然后除了2A以外的所有点深度都加1,对答案的贡献加nsiz[2]
整理得

dp[2]=dp[1]siz[2]+nsiz[2]=dp[1]+n2siz[2]

推广到一般形式:

dp[v]=dp[x]+n2siz[v]

不难发现只需要两次dfs,所以时间复杂度为O(n)

做法

1.先定一个根(一般是1),然后先算出答案,同时预处理一些转移需要的东西。
2.根据具体题目推式子转移。

Exercise

Simple:

Normal:

posted @   luyiming123  阅读(71)  评论(3编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示