换根dp
引入
Problem
现在有一个无根树,要你确定一个根,使得其他点到这个根的距离最短。
Solution
Thinking 1
枚举根,dfs暴力求距离,取最大值,时间复杂度。
Thinking 2
如果让根的子树变成根,那个树的形态其实很多都没变!如果再来一次的话,太浪费了!
我们考虑先选一个根节点(默认为1),然后dfs子树来更新。
假设我们现在已经通过第一次dfs算出了(以1为根的答案),来求。不难发现,和的深度都相比一开始减1,那么对答案的贡献就是减子树的大小,即,然后除了和以外的所有点深度都加1,对答案的贡献加。
整理得
推广到一般形式:
不难发现只需要两次dfs,所以时间复杂度为。
做法
1.先定一个根(一般是1),然后先算出答案,同时预处理一些转移需要的东西。
2.根据具体题目推式子转移。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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)