/*
两种做法
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. ubuntu14.04 Samba服务无法访问 网络名不再可用的问题

    参考链接 : https://blog.csdn.net/liuyixjtu/article/details/54575514

  2. python 中的"*"与"**"

    1.Python中 *和**很常见的运算符的用途及其多种使用方式. 本文所述的*和**,指的是*和**前缀运算符,而不是中缀运算符. 所以指的不是乘法和乘幂: 使用*和**将参数传递给函数 使用*和* ...

  3. L3-1 二叉搜索树的结构 (30 分)

    讲解的很不错的链接:https://blog.csdn.net/chudongfang2015/article/details/79446477#commentBox 题目链接:https://pin ...

  4. maven坐标的获取

    网址:https://mvnrepository.com 网站上可以搜索具体的组织或项目关键字,之后复制对应的坐标到pom.xml中.如:

  5. 20165337学习基础和C语言基础调查

    20165337学习基础和C语言基础调查 你有什么技能比大多人(超过90%以上)更好? 讲道理我感觉我自己没有什么能比90%以上的人都做得好的技能,我就瘸子里面拔将军挑一个我自认为还不错的技能吧. 我 ...

  6. pythonの连接MySQL数据库

    1.要确保开发环境中安装了pymsql,如果没有安装那么在控制台输入: pip3 install pymysql 安装完成后,打开编辑器: #!/usr/bin/env python import p ...

  7. java 八种基本数据类型

  8. 【leetcode】657. Robot Return to Origin

    Algorithm [leetcode]657. Robot Return to Origin https://leetcode.com/problems/robot-return-to-origin ...

  9. 负载均衡获得真实源IP的6种方法 【转】

    除了X-FORWARD-FOR,负载均衡中获得真实源IP的方法还有很多种, 本文抛砖引玉,主要介绍获得真实源IP的多种方法,而不是具体配置, 负载均衡获得真实IP的方法有很多种,将形成专题文章, 本文 ...

  10. PHP JSON 数据解析代码

    作者: 字体:[增加减小] 类型:转载   PHP解析JSON 数据代码,与大多数流行的 Web 服务如 twitter .人人网通过开放 API 来提供数据一样,它总是能够知道如何解析 API 数据 ...