洛谷 P10962:Computer ← 换根DP

news/2026/1/20 21:20:58/文章来源:https://www.cnblogs.com/triwa/p/19508825

【题目来源】
https://www.luogu.com.cn/problem/P10962
http://acm.hdu.edu.cn/showproblem.php?pid=2196

【题目描述】
某学校在一段时间前购买了第一台计算机(因此这台计算机的编号是 1)。在最近几年中,学校又购买了 N-1 台新计算机。每台新计算机都连接到之前已经安装的计算机之一。学校的管理人员对网络运行缓慢感到担忧,想知道每台计算机需要发送信号的最大距离 Si(即到最远计算机的电缆长度)。你需要提供这些信息。

P10962

提示:示例输入对应于此图。从图中可以看到,计算机 4 是距离计算机 1 最远的,因此 S1=3。计算机 4 和 5 是距离计算机 2 最远的,因此 S2=2。计算机 5 是距离计算机 3 最远的,因此 S3=3。我们还得到 S4=4,S5=4。

【输入格式】
输入文件包含多个测试用例。每个用例的第一行是自然数 N(N≤10000),接下来的 N-1 行描述了计算机的连接情况。第 i 行(i≥2)包含两个自然数 --- 第 i 台计算机连接的计算机编号和用于连接的电缆长度。电缆的总长度不超过 10^9。输入行中的数字由空格分隔。

【输出格式】
对于每个用例,输出 N 行。第 i 行必须包含第 i 台计算机的数值 Si(1≤i≤N)。

【输入样例】
5
1 1
2 1
3 1
1 1​​​​​​​

【输出样例】
3
2
3
4
4

【数据范围】
N≤10000,1≤i≤N

【算法分析】
● 换根 DP 是树形 DP 的一种重要技术,用于解决需要以树中‌不同节点为根‌分别计算答案的问题。其核心思想是在一次动态规划后,通过‌推导出换根时的状态转移公式‌,高效地计算出所有节点作为根时的结果,避免对每个根节点都进行一次 O(n) 的树形DP(那样总复杂度为 O(n²))。

● 对于大多数简单的树形 DP 问题,如计算子树大小、节点深度、简单路径统计等,算法通常对每个节点执行常数次操作,因此时间复杂度为 ‌O(n)‌。

● 换根 DP 通常遵循一个固定的两遍 DFS 流程:
(一)第一次 DFS(固定根,收集信息)‌
(1)任选一个节点(通常为 1 号节点)作为初始根。
(2)进行一次自底向上的树形 DP,计算以该节点为根时,各子树的状态信息。这些信息通常包括:子树大小(siz[u])、子树内节点到根的距离和(dis[u])、或其他与问题相关的子树最优解。
(二)第二次 DFS(换根,推导全局)‌
(1)这是算法的关键。基于第一次 DFS 得到的信息,从初始根节点开始,进行第二次 DFS。
(2)在遍历过程中,当从父节点 u 走向子节点 v 时,利用已知的以 u 为根时的全局答案 dp[u],推导出以 v 为根时的全局答案 dp[v]。
(3)这个推导过程就是 ‌“换根公式”‌,它分析了当根从 u 移到 v 时,哪些节点的贡献发生了变化(例如,深度增加或减少),并据此更新答案。

● 经典示例:所有节点到其他节点距离之和
​​​​​​​代码详见:https://blog.csdn.net/hnjzsyjyj/article/details/157169859
这是一个最经典的换根DP问题,清晰地展示了换根公式的推导过程。
(1)问题‌:给一棵树,求以每个节点为根时,所有节点到该根节点的深度之和。
(2)定义‌:siz[u]:以 u 为根的子树中的节点数、dis[u]:以 u 为根时,所有节点到 u 的深度之和。

P3478_1

(3)步骤‌:
第一次 DFS‌:以节点 1 为根,计算 siz[u] 和初始的 dis[1]。
换根公式推导‌:当根从 u 换到其子节点 v 时,所有在 v 子树中的节点,到新根 v 的距离比到旧根 u 的距离‌减少1‌。这部分贡献总共减少 siz[v]。所有不在 v 子树中的节点(共 n - siz[v] 个),到新根 v 的距离比到旧根 u 的距离‌增加1‌。这部分贡献总共增加 n - siz[v]。
因此,dis[v] = dis[u] - siz[v] + (n - siz[v]) = dis[u] + n - 2 * siz[v]。
第二次 DFS‌:应用此公式,即可从 dp[1] 递推计算出所有节点的 dis[i]。

● 本题数据量达到了 10^4,可以在代码中加入如下语句(https://blog.csdn.net/hnjzsyjyj/article/details/143176072),避免 TLE。

ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);

当然,也可以使用“快读(https://blog.csdn.net/hnjzsyjyj/article/details/120131534)”函数,代码如下。

int read() { //fast readint x=0,f=1;char c=getchar();while(c<'0' || c>'9') { //!isdigit(c)if(c=='-') f=-1;c=getchar();}while(c>='0' && c<='9') { //isdigit(c)x=x*10+c-'0';c=getchar();}return x*f;
}

● 本题输入样例解释
第 1 行,5,树的总节点数 n=5(节点编号为 1~5)。
第 2 行,1 1,对应节点 2,它的父节点是 1,与父节点之间的边权为 1。
第 3 行,2 1,对应节点 3,它的父节点是 2,与父节点之间的边权为 1。
第 4 行,3 1,对应节点 4,它的父节点是 3,与父节点之间的边权为 1。
第 5 行,1 1,对应节点 5,它的父节点是 1,与父节点之间的边权为 1。​​​​​​​

【算法代码】

#include <bits/stdc++.h>
using namespace std;const int N=1e4+5;
int f[N]; //Local (subtree) longest
int g[N]; //Local (subtree) secondary length
int dis[N]; //Globally (tree) longest
int val[N<<1],e[N<<1],ne[N<<1],h[N],idx;
int n;void add(int a,int b,int w) {val[idx]=w,e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}void dfs1(int u) {for(int i=h[u]; i!=-1; i=ne[i]) {int j=e[i],v=val[i];dfs1(j);if(f[j]+v>f[u]) g[u]=f[u],f[u]=f[j]+v;else if(f[j]+v>g[u]) g[u]=f[j]+v;}
}void dfs2(int u,int t) {dis[u]=max(t,f[u]);int fir=max(t,f[u]),sec=max(t,g[u]);for(int i=h[u]; i!=-1; i=ne[i]) {int j=e[i],v=val[i];if(f[j]+v==f[u]) dfs2(j,sec+v);else dfs2(j,fir+v);}
}int main() {while(cin>>n) {memset(h,-1,sizeof h);idx=0;for(int i=1; i<=n; i++) f[i]=g[i]=0;for(int i=2; i<=n; i++) {int x,w;cin>>x>>w;add(x,i,w);}dfs1(1);dfs2(1,0);for(int i=1; i<=n; i++) {cout<<dis[i]<<endl;}}return 0;
}/*
in:
5
1 1
2 1
3 1
1 1out:
3
2
3
4
4
*/





【参考文献】
https://mp.weixin.qq.com/s/Ulg9GIl0u2Qgh45FnC9OMg
https://blog.csdn.net/hnjzsyjyj/article/details/157169859
https://blog.csdn.net/hnjzsyjyj/article/details/157134513
https://www.cnblogs.com/mingloch/p/17678247.html
https://www.luogu.com.cn/problem/solution/P10962



 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1190829.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

activiti7的强制绑定角色问题

角色强绑定问题及解决方案 在使用若依的基础上,本打算将activiti7集成进去,结果在测试调用activiti的api时返回前端"没有权限,请联系管理员授权" 本来还以为是若依的权限校验,结果通过debug发现日志中报…

SCADA与数字孪生(Digital Twin)系统的异同点在哪里?

SCADA&#xff08;Supervisory Control and Data Acquisition&#xff0c;监控与数据采集系统&#xff09;和数字孪生&#xff08;Digital Twin&#xff09;系统都是工业自动化、智能制造和基础设施管理中的关键技术&#xff0c;但它们在目标、功能、技术架构和应用场景上存在显…

AI狂飙与冷思考:一个准码农的2026开年观察

AI狂飙与冷思考:一个准码农的2026开年观察* { margin: 0; padding: 0; box-sizing: border-box } body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue&quo…

完整教程:人机交互(如 VR 手柄追踪、光标移动、手势识别)的滤波算法

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

生成式软件制造--AI驱动的软件开发 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

【读书笔记】《稻盛和夫自传》

《稻盛和夫自传》&#xff1a;敬天爱人的人生与经营哲学 稻盛和夫的自传是一本全面记录其创业经历、经营哲学与方法论的著作。这本书不仅适用于企业家&#xff0c;更适合所有职场人士阅读。在当下内卷化严重的社会环境中&#xff0c;它帮助我们树立正确的工作观&#xff1a;不仅…

《把脉行业与技术趋势》-65-当你的人生轨迹与民族复兴的长波、技术革命的中波、行业爆发的短波同频共振时,平凡的努力,也会被时代放大成非凡的成就——这,便是“着道”的现代诠释。

民族的生命的周期、国家宏观政策的生命周期、行业发展的生命周期、技术发展生命周期、企业发展的周期、产品的发展生命周期、个人的职业操作周期&#xff0c;傅里叶级数的可视化用图示的方式展现了小周期要顺应大周期&#xff0c;多周期共振带来的杠杆效应。一、核心思想&#…

AI生成SQL的安全风险与测试框架

随着AI在软件开发中的普及&#xff0c;AI生成的SQL语句被广泛应用于数据库操作&#xff0c;但这也引入了新的安全隐患。SQL注入、未授权数据访问&#xff08;拖库&#xff09;和恶意删除&#xff08;删库&#xff09;已成为三大核心威胁。据行业报告&#xff0c;2025年因AI生成…

线段树合并

\(\text{luogu-4556}\) 村落里一共有 \(n\) 座房屋,并形成一个树状结构。然后救济粮分 \(m\) 次发放,每次选择两个房屋 \((x, y)\),然后对于 \(x\) 到 \(y\) 的路径上(含 \(x\) 和 \(y\))每座房子里发放一袋 \(z\…

454. 四数相加 II-day06

454. 四数相加 II 题目链接:https://leetcode.cn/problems/4sum-ii/description/ 思路:第一步:遍历nums1和nums2,统计「两数之和」的出现次数,存入哈希表map(键 = 两数之和,值 = 该和出现的次数); 第二步:遍…

《把脉行业与技术趋势》-69-股票的周期、产品的周期、企业的周期的相似性与不同,以及它们各自在不同阶段关注的重点和核心要素不同

这是一个极具战略价值的问题。股票、产品、企业三者虽相互嵌套、彼此影响&#xff0c;但它们的周期逻辑、驱动因素和阶段重心存在显著差异。理解其相似性与不同点&#xff0c;并掌握各阶段的核心关注要素&#xff0c;是投资者、创业者和管理者做出正确决策的关键。一、三者的本…

别让”高性能“骗了你 之数组池ArrayPool vs 数组Array

别让”高性能“骗了你 之数组池ArrayPool vs 数组Array别让”高性能“骗了你! 本文介绍了作者因为追求高性能而没有关注实际使用环境导致性能不升反降。高性能的ArrayPool在特殊工况下可能效率远低于普普通通的Array数…

若思中国发布2026年十大最具影响力战略咨询大师推荐榜 - 资讯焦点

2026 年中国战略咨询行业正经历技术重构与价值升级,AI 大数据驱动成为核心发展特征,行业从传统经验导向转向数据科学驱动,动态定位与实时响应能力成为核心竞争力。趋势层面,AI + 咨询深度融合、全周期陪跑服务模式…

大数据毕设选题推荐:基于大数据技术的Django框架下的学习资源推送系统的设计与实现基于Django+大数据的学习资源推送系统【附源码、mysql、文档、调试+代码讲解+全bao等】

java毕业设计-基于springboot的(源码LW部署文档全bao远程调试代码讲解等) 博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、…

大模型测试的“评估指标”:BLEU?ROUGE?都不够!

传统指标的黄金时代与局限 在机器翻译与文本摘要时代&#xff0c;BLEU和ROUGE曾是指标领域的双璧。BLEU通过n-gram精确匹配衡量译文准确性&#xff0c;ROUGE则基于召回率评估摘要内容覆盖度。然而&#xff0c;当千亿参数大模型掀起生成式AI浪潮时&#xff0c;这些指标暴露了三…

互联网大厂Java面试场景:分布式系统与微服务架构

场景&#xff1a;互联网大厂Java小白面试 面试官&#xff08;严肃&#xff09;&#xff1a; 我们来谈谈你对分布式系统和微服务的理解吧。假设现在有一个电商平台需要支持双十一高峰期的海量用户请求&#xff0c;如何设计一个高可用系统&#xff1f; 超好吃&#xff08;认真思考…

品牌整合营销战略咨询公司哪家靠谱? - 资讯焦点

摘要:据 2024 年中国品牌战略发展报告显示,72% 的企业存在不同程度的产品线内耗,45% 因此导致核心产品市场份额下滑。这一困境的核心根源是 “战略定位、价值表达、资源分配” 三重错位,即盲目扩张无聚焦、产品定位…

寒假学习笔记1.17

一、 内存间接寻址实现扩展寻址模式 直接寻址 vs 间接寻址 python原直接寻址:地址为立即数 def direct_addressing(addr): """直接寻址:[5] 表示内存地址5""" return MEMORY[int(addr…

计算机大数据毕设实战-基于Django+大数据的学习资源推送系统基于大数据+django+mysql的学习资源推送系统的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】

java毕业设计-基于springboot的(源码LW部署文档全bao远程调试代码讲解等) 博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、…

‌构建“大模型测试沙箱”:隔离、监控、审计的工程实践指南

‌一、背景&#xff1a;为何传统测试范式在大模型时代失效&#xff1f;‌大模型&#xff08;LLM&#xff09;的非确定性、黑盒性与高资源消耗&#xff0c;彻底颠覆了传统软件测试的底层假设&#xff1a;‌输出不可复现‌&#xff1a;相同输入在不同会话中可能产生语义一致但文本…