dp[u][0]表示u向下走的最大距离;

dp[u][1]表示u向下走的次大距离;

dp[u][2]表示u向上走的最大距离;

最后的答案就是每个点的max(dp[u][0],dp[u][2]);

求解次大距离并记录idx在求解向上最大距离中是有必要的,可以画图分析。

 1 #include<cstdio>
2 #include<cstring>
3 #include<algorithm>
4 using namespace std;
5 const int MAXN=10000+10;
6 int dp[MAXN][3];
7 int idx[MAXN];//用来记录u往下的最大距离经过哪个子节点
8 struct Edge{
9 int v,w,next;
10 }edge[MAXN<<1];
11 int cnt,head[MAXN];
12
13 void add(int u,int v,int w){
14 edge[cnt].v=v;
15 edge[cnt].w=w;
16 edge[cnt].next=head[u];
17 head[u]=cnt++;
18 }
19
20 void dfs1(int u,int fa){
21 int mx1=0,mx2=0;
22 for(int i=head[u];~i;i=edge[i].next){
23 int v=edge[i].v;
24 if(v==fa) continue;
25 dfs1(v,u);
26 int c=dp[v][0]+edge[i].w;
27 if(mx1<=c) mx2=mx1,mx1=c,idx[u]=v;
28 else if(mx2<c) mx2=c;
29 }
30 dp[u][0]=mx1;//向下走的最大值
31 dp[u][1]=mx2;//向下走的次大值
32 }
33
34 void dfs2(int u,int fa){//求u向上可以走的最大值
35 for(int i=head[u];~i;i=edge[i].next){
36 int v=edge[i].v;
37 if(v==fa) continue;
38 if(idx[u]==v)
39 dp[v][2]=max(dp[u][1],dp[u][2])+edge[i].w;
40 else
41 dp[v][2]=max(dp[u][0],dp[u][2])+edge[i].w;
42 dfs2(v,u);
43 }
44 }
45
46 int main(){
47 int n,a,b;
48 while(~scanf("%d",&n)){
49 cnt=0;
50 memset(head,-1,sizeof(head));
51 for(int i=2;i<=n;i++){
52 scanf("%d%d",&a,&b);
53 add(i,a,b);add(a,i,b);
54 }
55 memset(dp,0,sizeof(dp));
56 dfs1(1,1);
57 dfs2(1,1);
58 for(int i=1;i<=n;i++)
59 printf("%d\n",max(dp[i][0],dp[i][2]));
60 }
61 return 0;
62 }

HDU2196 Computer (树形DP-换根)的更多相关文章

  1. bzoj 3743 [Coci2015]Kamp——树形dp+换根

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3743 树形dp+换根. “从根出发又回到根” 减去 “mx ” . 注意dfsx里真的要改那 ...

  2. 树形dp换根,求切断任意边形成的两个子树的直径——hdu6686

    换根dp就是先任取一点为根,预处理出一些信息,然后在第二次dfs过程中进行状态的转移处理 本题难点在于任意割断一条边,求出剩下两棵子树的直径: 设割断的边为(u,v),设down[v]为以v为根的子树 ...

  3. poj3585 Accumulation Degree(树形dp,换根)

    题意: 给你一棵n个顶点的树,有n-1条边,每一条边有一个容量z,表示x点到y点最多能通过z容量的水. 你可以任意选择一个点,然后从这个点倒水,然后水会经过一些边流到叶节点从而流出.问你最多你能倒多少 ...

  4. poj3585 Accumulation Degree[树形DP换根]

    思路其实非常简单,借用一下最大流求法即可...默认以1为根时,$f[x]$表示以$x$为根的子树最大流.转移的话分两种情况,一种由叶子转移,一种由正常孩子转移,判断一下即可.换根的时候由頂向下递推转移 ...

  5. [题解](树形dp/换根)小x游世界树

    2. 小x游世界树 (yggdrasi.pas/c/cpp) [问题描述] 小x得到了一个(不可靠的)小道消息,传说中的神岛阿瓦隆在格陵兰海的某处,据说那里埋藏着亚瑟王的宝藏,这引起了小x的好奇,但当 ...

  6. HDU2196 - Computer(树形DP)

    题目大意 给定一颗n个结点的树,编号为1~n,要求你求出每个结点能到达的最长路径 题解 用动态规划解决的~~~~把1 当成树根,这样就转换成有根树了.我们可以发现,对于每个结点的最长路,要么是从子树得 ...

  7. computer(树形dp || 树的直径)

    Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  8. HDU 2196 Computer 树形DP 经典题

    给出一棵树,边有权值,求出离每一个节点最远的点的距离 树形DP,经典题 本来这道题是无根树,可以随意选择root, 但是根据输入数据的方式,选择root=1明显可以方便很多. 我们先把边权转化为点权, ...

  9. HDU 2196.Computer 树形dp 树的直径

    Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  10. HDU 2196 Computer 树形DP经典题

    链接:http://acm.hdu.edu.cn/showproblem.php? pid=2196 题意:每一个电脑都用线连接到了还有一台电脑,连接用的线有一定的长度,最后把全部电脑连成了一棵树,问 ...

随机推荐

  1. 2022-7-18 第五组 pan 面向对象

    面向过程 向过程就是:面向过程,其实就是面向着具体的每一个步骤和过程,把每一个步骤和过程完成,然后由这些功能方法相互调用,完成需求. 面向对象 什么是面向对象: 面向对象思想就是不断的创建对象,使用对 ...

  2. 清理忽略springboot控制台启动的banner和启动日志

    清理忽略springboot控制台启动的banner和启动日志 1.springboot的banner spring: main: banner-mode: off 2.mybatis-plus的ba ...

  3. 技术分享|sysbench 压测工具用法浅析

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 介绍 新业务上线的时候通常需要对数据库性能进行压力测试,以确认是否满足需要,今天简单介绍下sysbench的用法: 1.s ...

  4. Redis 定长队列的探索和实践

    vivo 互联网服务器团队 - Wang Zhi 一.业务背景 从技术的角度来说,技术方案的选型都是受限于实际的业务场景,都以解决实际业务场景为目标. 在我们的实际业务场景中,需要以游戏的维度收集和上 ...

  5. MyBatis 04 实战

    增删改查实现 在实际使用中,MyBatis 的使用遵从一定的规范. 常用的增删改查的 MyBatis 实现如下: Mapper.xml <?xml version="1.0" ...

  6. DS二叉树——二叉树之数组存储

    题目描述 二叉树可以采用数组的方法进行存储,把数组中的数据依次自上而下,自左至右存储到二叉树结点中,一般二叉树与完全二叉树对比,比完全二叉树缺少的结点就在数组中用0来表示.,如下图所示 从上图可以看出 ...

  7. Android Studio 模拟器(AVD)访问互联网

    模拟器默认是不可以直接访问互联网的,需要为模拟器配置 DNS 服务器. (一)找到模拟器安装的位置 模拟器安装位置在安卓 SDK 下面,进入[SDK Path]/emulator. (二)打开终端输入 ...

  8. JavaScript基础回顾知识点记录3

    js 中 垃圾回收 //将不在使用的对象设置为null , js就会自动进行垃圾回收机制 var obj = {}; obj = null; js 中 数组基本介绍 数组也是一个对象 与普通对象功能类 ...

  9. 痞子衡嵌入式:MCUXpresso IDE下设置代码编译优化等级的几种方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是MCUXpresso IDE下设置代码编译优化等级的几种方法. 最近公司芯片设计团队正在开发一款全新的基于 Cortex-M33 内核的 ...

  10. 强大多云混合多K8S集群管理平台Rancher入门实战

    @ 目录 概述 定义 为何使用 其他产品 安装 简述 规划 基础环境 Docker安装 Rancher安装 创建用户 创建集群 添加Node节点 配置kubectl 创建项目和名称空间 发布应用 偏好 ...