• 题面

    A school bought the first computer some time ago(so this computer’s id is 1). During the recent years the school bought N-1 new computers. Each new computer was connected to one of settled earlier. Managers of school are anxious about slow functioning of the net and want to know the maximum distance Si for which i-th computer needs to send signal (i.e. length of cable to the most distant computer). You need to provide this information.

    Hint: the example input is corrsponding to this graph. And from the graph, you can see that the computer 4 is farthest one from 1, so S1 = 3. Computer 4 and 5 are the farthest ones from 2, so S2 = 2. Computer 5 is the farthest one from 3, so S3 = 3. we also get S4 = 4, S5 = 4.

    Input

    Input file contains multiple test cases.In each case there is natural number N (N<=10000) in the first line, followed by (N-1) lines with descriptions of computers. i-th line contains two natural numbers - number of computer, to which i-th computer is connected and length of cable used for connection. Total length of cable does not exceed 10^9. Numbers in lines of input are separated by a space.

    Output

    For each case output N lines. i-th line must contain number Si for i-th computer (1<=i<=N).

    Sample Input

    5
    1 1
    2 1
    3 1
    1 1
    

    Sample Output

    3
    2
    3
    4
    4
    
  • 题目大意

    给出一棵树,求离每个节点最远的点的距离

  • 解题思路

    这种问题我们很容易想到树形DP,而对于这种无根树,我们必须要知道节点uuu的最远距离是怎么来的:

    • 来自它的孩子部。
    • 来自它的父亲部。

    如下图所示:

求孩子部的最远距离好求,我们利用树形DPDPDP递归从下到上求解即可。而来自父亲部的最远距离我们怎么求呢?那么我们就需要知道父亲部的最远距离怎么求?有两种情况。

  • 父节点的父亲部。
  • 父节点的孩子部。

由上可知,父节点的孩子部可能包含了我们这蓝色的部分,即我们要求的uuu的孩子部,这显然是不合理的,我们需要排除这种情况。则我们就可以判断一下:我们需要判断一下,假如fu的最远点路径经过了u,那么我们就不继承他,改为继承fu子树的次远点距离。那么也就是说,我们是先求出来自孩子部的最远距离和次远距离,这需要我们利用一次树形DPDPDP跑dfsdfsdfs解决,而如果需要求来自父亲部的最远距离的话,我们需要通过继承我们的父节点的最远距离和次远距离,这样才能求解。而第二遍的树形DPDPDP方程如下:

设f[u][0]f[u][0]f[u][0]为节点uuu孩子部的最远距离,f[u][1]f[u][1]f[u][1]为节点uuu孩子部的次远距离,而f[u][2]f[u][2]f[u][2]则为节点uuu父亲部的次元距离。

当uuu在fufufu的最远点路径上,那么f[u][2]=max(f[u][1],f[u][2])+w[u][v]f[u][2]=max(f[u][1],f[u][2])+w[u][v]f[u][2]=max(f[u][1],f[u][2])+w[u][v]

当uuu不在fufufu的最远点路径上,那么f[u][2]=max(f[u][0],f[u][2])+w[u][v]f[u][2]=max(f[u][0],f[u][2])+w[u][v]f[u][2]=max(f[u][0],f[u][2])+w[u][v]

跑完两边之后易知每个节点iii的最远距离为max(f[i][0],f[i][2])max(f[i][0],f[i][2])max(f[i][0],f[i][2])

  • AC代码
/***@filename:HDU-Computer*@author: pursuit*@csdn:unique_pursuit*@email: 2825841950@qq.com*@created: 2021-05-19 21:47
**/
#include <bits/stdc++.h>using namespace std;typedef long long ll;
const int N = 20010;
const int P = 1e9 + 7;int n;
ll f[N][3];//其中我们可以用f[i][0]表示i节点孩子部的最远点距离,f[i][1]表示为i节点孩子部的次远点距离。f[i][1]表示为i节点父亲部的最远距离。
struct Edge{//next为当前边的下一条边,to为此边终点,w为边权值。int next,to;ll w;
}edges[N];
int head[N],tot;//head[i]表示以i为起点的第一条边的编号,若为-1则表示该起点没有边。tot则表示边的编号。
int son[N];//son[u]表示u的最大路径经过了son[u].
void add(int u,int v,ll w){//加边函数。tot++;edges[tot].to = v;edges[tot].w = w;edges[tot].next = head[u];head[u] = tot;//改变第一条边的编号。
}
void init(){//初始化。tot = 0;memset(head,-1,sizeof(head));memset(f,0,sizeof(f));memset(son,0,sizeof(son));
}
void dfs1(int u,int fu){//第一遍dfs。求出每个点u向下的最大距离和次大距离。并且用son[u]记录最大路径经过了与u直接相邻的哪一个子节点。for(int i = head[u]; i != -1; i = edges[i].next){int v = edges[i].to;if(v == fu)continue;int w = edges[i].w;dfs1(v,u);//递归子树。if(f[u][0] < f[v][0] + w){son[u] = v;//记录最大路径的子树节点。f[u][1] = f[u][0];//更新次大距离。f[u][0] = f[v][0] + w;}else if(f[u][1] < f[v][0] + w){f[u][1] = f[v][0] + w;}}
}
void dfs2(int u,int fu){//第二遍dfs,对于当前节点u,如果满足son[u] = v;说明u的最大路径经过了v,//v一定不能通过u的最大路来更新答案。只能通过u的次大路。而u的次大路一定的那个不会经过v。for(int i = head[u]; i != -1; i = edges[i].next){int v = edges[i].to;int w = edges[i].w;if(v == fu)continue;if(son[u] != v){f[v][2] = max(f[u][0],f[u][2]) + w;}else{f[v][2] = max(f[u][1],f[u][2]) + w;}dfs2(v,u);}
}
void solve(){dfs1(1,0);f[1][2] = f[1][1];//根节点的路径一样。dfs2(1,0);for(int i = 1; i <= n; i++){cout << max(f[i][2],f[i][0]) << endl;}
}
int main(){while(cin >> n){init();int y;ll z;for(int x = 2; x <= n; x++){cin >> y >> z;add(x,y,z);add(y,x,z);}solve();}return 0;
}

HDU-2196Computer 树形DP-经典题相关推荐

  1. POJ 1155 TELE 背包型树形DP 经典题

    由电视台,中转站,和用户的电视组成的体系刚好是一棵树 n个节点,编号分别为1~n,1是电视台中心,2~n-m是中转站,n-m+1~n是用户,1为root 现在节点1准备转播一场比赛,已知从一个节点传送 ...

  2. HDU 2196 Computer 树形DP经典题

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

  3. hdu_Anniversary party_(树形DP入门题)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 题意:有N个人,N-1个人有自己的上司,每个人有一个快乐值,如果这个人参加了聚会,那么这个人的直 ...

  4. 洛谷P1352 没有上司的舞会(树形DP水题)

    题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri, ...

  5. 树形dp瞎讲+树形dp基础题题解

    ---恢复内容开始--- 没错 咕了这么久(没有青青姐久 我又开始写博客了( ´▽`) 想了很久些什么(才没有想过呢 虽然被鄙视基础不好但还是走上了树形dp的不归路 那么 就来写写树形dp吧(dtx ...

  6. hdu 2196 树形dp

    [题意]:给出一棵树, 每条边有一个权值 求离每个节点最远的点的权值和 看这篇题解学会的  http://tech.ddvip.com/2013-09/1379006959202653.html 树形 ...

  7. 树形dp进阶题2 JSOI2018潜入行动

    JSOI2018 潜入行动 题目描述 外星人又双叒叕要攻打地球了,外星母舰已经向地球航行!这一次,JYY 已经联系好了黄金舰队,打算联合所有 JSOIer 抵御外星人的进攻. 在黄金舰队就位之前,JY ...

  8. hdu 1520 树形dp

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 #include<cstdio> #include<cstring> # ...

  9. hdu 5148 树形dp,分组背包

    题目: 题目分析: 状态方程: dp[当前节点的标号][当前已经选取的城市数] 设已经选取的城市数是K 初始状态: dp[u][0] = dp[u][1] = 0 , 其他的将值设置为无穷大 树形转移 ...

  10. Starship Troopers(HDU 1011 树形DP)

    题意: 给定n个定点和m个士兵,n个定点最终构成一棵树,每个定点有一定x个bugs和y个value,每20个bug需要消耗一个士兵,不足20也消耗一个,然后最终收获y个value,只有父节点被占领后子 ...

最新文章

  1. 【MATLAB】符号数学计算(三):符号的精度计算
  2. java8 求和_java8求和
  3. 030_自己实现一个HashSet
  4. ACM学习历程—HDU2476 String painter(动态规划)
  5. spring vaadin_在Spring Boot中使用Vaadin的简介
  6. 通信与计算机网络FSC,数据通信与计算机网络概述信道习题.pdf
  7. azure夜校培训第四场3月8日18:00---网络服务
  8. python的__name__
  9. 《Python入门到精通》运算符
  10. android opencv中图像分割,opencv在android平台下的开发【4】-图像滤波详解
  11. [转]C# 实现Jwt bearer Authentication
  12. 【互联网安全】阿里云安全专家为你详细解读内容安全及防护
  13. WinForm中的特殊窗体效果:渐变窗口和信息提示窗口
  14. 程序猿应该拥有的浏览器
  15. 提高WordPress访问速度的十种方法
  16. python、R对比分析
  17. 最新如何将b站视频下载到电脑上不用插件
  18. My Eighty-second Page - 打家劫舍Ⅱ - By Nicolas
  19. 什么是Subscript?
  20. php pecl 扩展,PECL

热门文章

  1. excel作图如何取最近一段时间的数据
  2. OpenGL学习之路13----相机控制(鼠标操作)
  3. JAVA通过Graphics2D生成表格图片
  4. 【Android】之屏幕适配
  5. java读取pdf三维图片_java 读取PDF文件生成图片形式
  6. u9服务器系统,U9服务器选型和部署方案doc .doc
  7. 故障:电脑频繁短暂黑屏
  8. 深入浅出 TypeScript
  9. 象棋联机java代码_中国象棋源代码Java程序
  10. 狄利克雷卷积与莫比乌斯函数