HDU2196 Computer (树形DP-换根)
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-换根)的更多相关文章
- bzoj 3743 [Coci2015]Kamp——树形dp+换根
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3743 树形dp+换根. “从根出发又回到根” 减去 “mx ” . 注意dfsx里真的要改那 ...
- 树形dp换根,求切断任意边形成的两个子树的直径——hdu6686
换根dp就是先任取一点为根,预处理出一些信息,然后在第二次dfs过程中进行状态的转移处理 本题难点在于任意割断一条边,求出剩下两棵子树的直径: 设割断的边为(u,v),设down[v]为以v为根的子树 ...
- poj3585 Accumulation Degree(树形dp,换根)
题意: 给你一棵n个顶点的树,有n-1条边,每一条边有一个容量z,表示x点到y点最多能通过z容量的水. 你可以任意选择一个点,然后从这个点倒水,然后水会经过一些边流到叶节点从而流出.问你最多你能倒多少 ...
- poj3585 Accumulation Degree[树形DP换根]
思路其实非常简单,借用一下最大流求法即可...默认以1为根时,$f[x]$表示以$x$为根的子树最大流.转移的话分两种情况,一种由叶子转移,一种由正常孩子转移,判断一下即可.换根的时候由頂向下递推转移 ...
- [题解](树形dp/换根)小x游世界树
2. 小x游世界树 (yggdrasi.pas/c/cpp) [问题描述] 小x得到了一个(不可靠的)小道消息,传说中的神岛阿瓦隆在格陵兰海的某处,据说那里埋藏着亚瑟王的宝藏,这引起了小x的好奇,但当 ...
- HDU2196 - Computer(树形DP)
题目大意 给定一颗n个结点的树,编号为1~n,要求你求出每个结点能到达的最长路径 题解 用动态规划解决的~~~~把1 当成树根,这样就转换成有根树了.我们可以发现,对于每个结点的最长路,要么是从子树得 ...
- computer(树形dp || 树的直径)
Computer Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- HDU 2196 Computer 树形DP 经典题
给出一棵树,边有权值,求出离每一个节点最远的点的距离 树形DP,经典题 本来这道题是无根树,可以随意选择root, 但是根据输入数据的方式,选择root=1明显可以方便很多. 我们先把边权转化为点权, ...
- HDU 2196.Computer 树形dp 树的直径
Computer Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- HDU 2196 Computer 树形DP经典题
链接:http://acm.hdu.edu.cn/showproblem.php? pid=2196 题意:每一个电脑都用线连接到了还有一台电脑,连接用的线有一定的长度,最后把全部电脑连成了一棵树,问 ...
随机推荐
- 论文解读(MaskGAE)《MaskGAE: Masked Graph Modeling Meets Graph Autoencoders》
论文信息 论文标题:MaskGAE: Masked Graph Modeling Meets Graph Autoencoders论文作者:Jintang Li, Ruofan Wu, Wangbin ...
- 2022-7-12 第五组 pan小堂 js
JavaScript Switch 语句 (熟悉掌握) 请使用 switch 语句来选择多个需被执行的代码块之一. 语法: switch(表达式){ case n: 代码块 break; case n ...
- Linux系列之管理用户环境变量
前言 环境变量控制你在Linux工作环境中的外观.行为和感觉.一共有两种类型的变量: 环境变量:这些是内置于系统中的进程范围的变量,控制着系统的外观和行为.因为是进程范围的,所以它们被任何子shell ...
- 一文搞懂│php 中的 DI 依赖注入
目录 什么是 DI / 依赖注入 依赖注入出现的原因 简单的依赖注入 高阶的依赖注入 依赖注入的应用 依赖注入高阶优化 什么是 DI / 依赖注入 依赖注入DI 其实本质上是指对类的依赖通过构造器完成 ...
- 万答#14,xtrabackup8.0怎么恢复单表
欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 实 ...
- @Autowired注解 --required a single bean, but 2 were found出现的原因以及解决方法
@Autowired注解是spring用来支持依赖注入的核心利器之一,但是我们或多或少都会遇到required a single bean, but 2 were found(2可能是其他数字)的问题 ...
- 美女 Committer 手把手教你部署 Apache DolphinScheduler 单机版
还在为如何部署Apache DolphinScheduler 发愁么?自上篇<美女 Committer 手把手教你使用海豚调度>的视频发布后,受到社区伙伴们的热烈欢迎.但个别小伙伴在部署这 ...
- BZOJ4580/Luogu3147 [Usaco2016 Open]248
amazing #include <iostream> #include <cstdio> #include <cstring> #include <algo ...
- Java SE 10 Application Class-Data Sharing 示例
Java SE 10 Application Class-Data Sharing 示例 作者:Grey 原文地址:Java SE 10 Application Class-Data Sharing ...
- 【Java】学习路径60-利用TCP协议接收多个客户端的数据
import java.io.IOException; import java.net.*; public class TCP_Server { public static void main(Str ...