/*
两种做法
1.求出树直径v1,v2,那么有一个性质:任取一点u,树上到u距离最远的点必定是v1或v2
那么可以一次dfs求树v1
第二次求dis1[],求出所有点到v1的距离,同时求出v2
第三次求出dis2[],求出所有点到v2的距离
2.树形dp,dp[u][0|1]表示结点u向下的最大距离和向上的最大距离
dp[u][0]可以直接由子树求出
dp[u][1]应该从父节点推到子节点,如果v是u的大儿子,那么dp[v][1]=max(sec,dp[u][1])+e[i].w;
否则就是dp[v][1]=max(Max,dp[u][1])+e[i].w
*/
#include<bits/stdc++.h>
using namespace std;
#define maxn 10005
struct Edge{int to,nxt,w;}edge[maxn<<];
int head[maxn],tot,n;
long long dp[maxn][];
void init(){
memset(head,-,sizeof head);
tot=;
}
void addedge(int u,int v,int w){
edge[tot].to=v;edge[tot].w=w;edge[tot].nxt=head[u];head[u]=tot++;
}
void dfs0(int u,int pre){
dp[u][]=;
for(int i=head[u];i!=-;i=edge[i].nxt){
int v=edge[i].to;
if(v!=pre){
dfs0(v,u);
dp[u][]=max(dp[u][],dp[v][]+edge[i].w);
}
}
}
void dfs1(int u,int pre){
long long Max=,Sec=,v1,v2;//u的大儿子下标,二儿子下标
for(int i=head[u];i!=-;i=edge[i].nxt){//这个循环处理出u的大儿子
int v=edge[i].to;
if(v==pre)continue;
int tmp=edge[i].w+dp[v][];
if(tmp>Max){//找到了更大的儿子树
Sec=Max,Max=tmp;
v2=v1,v1=v;
}
else if(tmp==Max || tmp>Sec)
Sec=tmp,v2=v;
}
//printf("%d %d\n",u,Max);
if(u!=-){//和u的上面进行比较
long long tmp=dp[u][],v=-;
if(tmp>Max){//找到了更大的儿子树
Sec=Max,Max=tmp;
v2=v1,v1=v;
}
else if(tmp==Max || tmp>Sec)
Sec=tmp,v2=v;
} for(int i=head[u];i!=-;i=edge[i].nxt){//这个循环求dp进行递归
int v=edge[i].to;
if(v==pre)continue;
if(v==v1)dp[v][]=Sec+edge[i].w;
else dp[v][]=Max+edge[i].w;
dfs1(v,u);
}
//printf("%d %d\n",u,Max);
}
int main(){
while(cin>>n){
init();
for(int v=;v<=n;v++){
int u,w;
cin>>u>>w;
addedge(u,v,w);
addedge(v,u,w);
}
memset(dp,,sizeof dp);
dfs0(,);dfs1(,);
for(int i=;i<=n;i++)
printf("%lld\n",max(dp[i][],dp[i][]));
}
}

hdu2196 树形dp经典|树的直径的更多相关文章

  1. HDU 4514 - 湫湫系列故事——设计风景线 - [并查集判无向图环][树形DP求树的直径]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4514 Time Limit: 6000/3000 MS (Java/Others) Memory Li ...

  2. 浅谈关于树形dp求树的直径问题

    在一个有n个节点,n-1条无向边的无向图中,求图中最远两个节点的距离,那么将这个图看做一棵无根树,要求的即是树的直径. 求树的直径主要有两种方法:树形dp和两次bfs/dfs,因为我太菜了不会写后者这 ...

  3. 树形DP 学习笔记(树形DP、树的直径、树的重心)

    前言:寒假讲过树形DP,这次再复习一下. -------------- 基本的树形DP 实现形式 树形DP的主要实现形式是$dfs$.这是因为树的特殊结构决定的——只有确定了儿子,才能决定父亲.划分阶 ...

  4. hdoj2196(树形dp,树的直径)

    题目链接:https://vjudge.net/problem/HDU-2196 题意:给出一棵树,求每个结点可以到达的最远距离. 思路: 如果求得是树上最长距离,两次bfs就行.但这里求的是所有点的 ...

  5. 树形dp - 求树的直径

    随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形,那就建的越长越好. 现在已经勘探确定了n个位置可 ...

  6. codeforce 337D Book of Evil ----树形DP&bfs&树的直径

    比较经典的老题 题目意思:给你一颗节点数为n的树,然后其中m个特殊点,再给你一个值d,问你在树中有多少个点到这m个点的距离都不大于d. 这题的写法有点像树的直径求法,先随便选择一个点(姑且设为点1)来 ...

  7. POJ 1985 Cow Marathon (树形DP,树的直径)

    题意:给定一棵树,然后让你找出它的直径,也就是两点中的最远距离. 析:很明显这是一个树上DP,应该有三种方式,分别是两次DFS,两次BFS,和一次DFS,我只写了后两种. 代码如下: 两次BFS: # ...

  8. 【NOI P模拟赛】最短路(树形DP,树的直径)

    题面 给定一棵 n n n 个结点的无根树,每条边的边权均为 1 1 1 . 树上标记有 m m m 个互不相同的关键点,小 A \tt A A 会在这 m m m 个点中等概率随机地选择 k k k ...

  9. 树形DP求树的直径

    hdu4607 Park Visit Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...

随机推荐

  1. JMeter(三)遇到的问题01: 通过CSV Data Set Config参数化有中文时,显示为?

    当使用CSV Data Set Config进行参数化,内容中含有中文时,响应文本显示为? 解决办法:只需要将“file encoding”设置为“gb2312”就可以了.

  2. sockaddr_in 与 in_addr的区别

    struct sockaddr_in {short int sin_family; /* 地址族 */unsigned short int sin_port; /* 端口号 */struct in_a ...

  3. call,apply和bind的区别

    call,apply继承并调用该函数,bind继承后未调用函数. var React = require('react'); //核心 var ReactDom = require('react-do ...

  4. 人人开源分模块,非原生html报错,很难查找问题所在,有vue语法

    <!DOCTYPE html> <html> <head> <title>学生表</title> #parse("sys/head ...

  5. shiro--《跟我学Shiro》网友学习系列

    第八章 拦截器机制——<跟我学Shiro> - 开涛的博客—公众号:kaitao-1234567,一如既往的干货分享 - ITeye博客http://jinnianshilongnian. ...

  6. Pickup Objective Actor

    在角色的头文件中,添加一个布尔变量,设为共有状态,用来判断是否携带目标物体,并暴露给蓝图,类型为仅蓝图可读 UPROPERTY(BlueprintReadOnly,Category="Gam ...

  7. 【转】python类中super()和__init__()的区别

    [转]python类中super()和__init__()的区别 单继承时super()和__init__()实现的功能是类似的 class Base(object): def __init__(se ...

  8. Python3-socket网络知识储备

    本文参考文章:http://www.cnblogs.com/linhaifeng/articles/6129246.html 计算机基础知识 客户端软件基于网络发送一条信息给服务端软件,流程是: 1. ...

  9. windows下安装MySql + navicat(图形化界面)

    MySQL安装过程参考:https://www.cnblogs.com/ayyl/p/5978418.html navicat图形化界面安装过程参考:https://www.cnblogs.com/l ...

  10. 四重解法---P1047 校门外的树

    题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,--,L,都种 ...