<题目链接>

题目大意:

输出树上每个点到其它点的最大距离。

解题分析:

下面的做法是将树看成有向图的做法,计算最长路需要考虑几种情况。

dp[i][0] : 表示以i为根的子树中的结点与i的最大距离

dp[i][1] : 表示以i为根的子树中的结点与i的次大距离

dp[i][2] : 表示i往父亲节点方向走的最大距离

第一就是点 i 在以点 i 为根的子树中的最长距离,这个可以直接在点 i 的子树中求得;

第二就是点 i 朝父亲节点方向的最长距离,这个距离分为三种:

1) 点 i 在以 fa 为根的子树中的最长路径上,这时的它朝fa 的最长距离(但是不超过fa的子树继续向上,即只在fa的子树的其它分支进行操作)为 cost<u,fa> + 以fa 为根的子树中的次长路;                           

2)点 i 不在以fa 为根的子树的最长路径上,这时它朝 fa 的最长距离为(但是不超过fa 的子树继续向上,即只在fa的子树的其它分支进行操作), cost<u,fa> + fa 子树中的最长路;

3)点 i 向 fa 的 fa 的子树进行扩展比较,所以需要和dp[fa][2] 比较。

 #include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int N = 1e4 +;
int dp[N][];
struct Node{
int to,next,cost;
}edge[N]; int n,cnt,head[N];
void init(){
cnt=;
memset(head,-,sizeof(head));
}
void addedge(int u,int v,int w){
edge[cnt].to=v,edge[cnt].cost=w,edge[cnt].next=head[u];
head[u]=cnt++;
}
void dfs1(int u){
int ans1=,ans2=;
for(int i=head[u];~i;i=edge[i].next){
int v=edge[i].to,cost=edge[i].cost;
dfs1(v);
int res=dp[v][]+cost;
if(res>=ans1){
ans2=ans1; //ans1记录最长路,ans2记录次长路
ans1=res;
}else if(res>ans2) ans2=res;
}
dp[u][]=ans1; //dp[u][0]为以u为根的子树的最长路
dp[u][]=ans2; //dp[u][1]为以u为根的子树的次长路
}
void dfs2(int fa){
for(int i=head[fa];~i;i=edge[i].next){
int v=edge[i].to,cost=edge[i].cost;
dp[v][]=max(dp[fa][],dp[v][]+cost == dp[fa][]? dp[fa][]:dp[fa][])+cost;
//dp[fa][2]表示向父亲方向走的最长路; 按v是否在以fa为根的子树中的最长路径上分类讨论,dp[v][2]有两种选择
//相当于,上面的式子考虑了v向fa方向走最长路的三种情况
dfs2(v);
}
}
int main(){
while(~scanf("%d",&n)){
init();
for(int i=;i<=n;i++){
int u,w;scanf("%d%d",&u,&w);
addedge(u,i,w);
}
dfs1();dfs2();
for(int i=;i<=n;i++){
printf("%d\n",max(dp[i][],dp[i][])); //以i为根的最长路;向父亲方向走的最长路
}
}
}

2019-02-03

HDU 2196 Computer (树上最长路)【树形DP】的更多相关文章

  1. 中南大学oj 1317 Find the max Link 边权可以为负的树上最长路 树形dp 不能两遍dfs

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1317经典问题:树上最长路,边权可以为负值的,树形dp,不能用两边dfs.反例:5 41 2 22 ...

  2. hdu 6501 transaction transaction transaction 最长路/树形DP/网络流

    最长路: 设置一个虚拟起点和虚拟终点,每个点与起点间一条负边,值为这个点书的价值的相反数(代表买书花钱),每个点与终点连一条正边,值为这个点的书的价格(代表卖书赚钱). 然后按照图中给的边建无向边,权 ...

  3. HDU 2196 Computer( 树上节点的最远距离 )

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

  4. HihoCoder1050 树中的最长路 树形DP第三题(找不到对象)

    题意:求出的树中距离最远的两个结点之间相隔的距离. 水题一道,以前只会用路的直径来解. 代码如下: #include<cstdio> #include<cstdlib> #in ...

  5. HDU4612 Warm up —— 边双联通分量 + 重边 + 缩点 + 树上最长路

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4612 Warm up Time Limit: 10000/5000 MS (Java/Ot ...

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

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

  7. HDU 2196 Computer 树形DP经典题

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

  8. HDU 2196 Computer(求树上每个点的最长距离)

    题意: 这题想了挺久的, 参考了kuangbin大神的代码:https://www.cnblogs.com/kuangbin/archive/2012/08/28/2659915.html 给出树上边 ...

  9. HDU 2196 Computer 树形DP 经典题

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

随机推荐

  1. login_code

    #! -*- coding:utf-8 -*-"""http://www.cnblogs.com/weke/articles/6271206.html前置和后置1.set ...

  2. RemoveDuplicatesfromSortedList

    给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 示例 1: 输入: 1->1->2 输出: 1->2 示例 2: 输入: 1->1->2->3-&g ...

  3. 1873: This offer(zzuli)

    题目描述 话说WX入职已经有一个多月了,公司boss突然扔给他了一个问题,如果解决不了的话就会被开除掉 - -#,情急之下他只能来请教你了,boss给了他N个不大于100的数,现在wx需要将这N个数通 ...

  4. HTML 转义字符对应表

    <%@ tag language="java" pageEncoding="UTF-8" %> <%@ attribute name=&quo ...

  5. 20165314 2016-2017-2 《Java程序设计》第9周学习总结

    20165314 2016-2017-2 <Java程序设计>第9周学习总结 教材学习内容总结 URl类 UDP数据报 广播数据报 套接字 套接字连接机制 代码托管

  6. html5 drag 文件拖拽浅淡

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. jvm(转)

    原:https://blog.csdn.net/luomingkui1109/article/details/72820232 1.JVM简析:      作为一名Java使用者,掌握JVM的体系结构 ...

  8. 论文阅读笔记十二:Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation(DeepLabv3+)(CVPR2018)

    论文链接:https://arxiv.org/abs/1802.02611 tensorflow 官方实现: https: //github.com/tensorflow/models/tree/ma ...

  9. 图像特征的提取(gaussian,gabor,frangi,hessian,Morphology...)及将图片保存为txt文件

    # -*- coding: utf-8 -*- #2018-2-19 14:30:30#Author:Fourmi_gsj import cv2 import numpy as np import p ...

  10. Python函数之递归函数

    递归函数的定义:在这个函数里再调用这个函数本身 最大递归深度默认是997或者998,python从内存角度做的限制 优点:代码变简单 缺点:占内存 一:推导年龄 问a的值是多少: a 比 b 小2,b ...