就是求每个点为起始点的最长链的长度。

写一下各个数组的意思吧。

f[i][0]为点i向下走最长的距离;f[i][1]为点i向下走第二长的距离;

xia[i][0]为点i向下走最长距离所要走的儿子节点;

xia[i][1]为点i向下走第二长长距离所要走的儿子节点;

f[i][2]为点i向上走的最大距离;

显而易见求向下的DP递推就好了。

求向上的DP

注意:两个DP都是从根节点往下更新。

#include<cstdio>
#include<algorithm>
#include<cstring>
#define maxn 10010 << 1
using namespace std;
int head[maxn],tot,n,u,v,val,len[maxn],f[maxn][];
int xia[maxn][],l[maxn];
struct st{
int v,val,next;
st clear(){
v = val = next = ;
}
}s[maxn]; void add(int u,int v,int val)
{
tot++;
s[tot].v = v;
s[tot].val = val;
s[tot].next = head[u];
head[u] = tot;
} void dfs(int fa,int now)
{
for(int i=head[now];i;i=s[i].next)
if(s[i].v != fa)
{
l[s[i].v] = s[i].val;
dfs(now,s[i].v);
len[now] = max(len[s[i].v] + s[i].val,len[now]);
int k = len[s[i].v] + s[i].val;
if(f[now][] < k)
{
f[now][] = k;
xia[now][] = s[i].v;
}
if(f[now][] > f[now][])
{
swap(xia[now][],xia[now][]);
swap(f[now][],f[now][]);
}
}
} void find(int fa,int now)
{
f[now][] = max(f[fa][] , now == xia[fa][] ? f[fa][] : f[fa][]) + l[now];
for(int i=head[now];i;i=s[i].next)
if(s[i].v != fa)
find(now,s[i].v);
} int main(){ while(scanf("%d",&n) != EOF)
{ for(int i=;i<= * n;i++)
{
head[i] = f[i][] = f[i][] = f[i][] = len[i] = l[i] = xia[i][] = xia[i][] = ;
s[i].clear();
}
tot = ;
for(int i=;i<=n;i++)
{
scanf("%d%d",&v,&val);
add(i,v,val);
add(v,i,val);
} dfs(,); find(,); for(int i=;i<=n;i++) printf("%d\n",max(f[i][],f[i][])); }
}

HDU2196computer的更多相关文章

  1. HDU2196computer(树上最远距离 + DP)

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

  2. HDU2196-Computer

    原题连接: http://acm.hdu.edu.cn/showproblem.php?pid=2196 思路: 好了,无敌了,经过昨晚4个钟头+今上午1个小时的奋战,这题终于被我AC了 收获的确是不 ...

  3. hdu2196Computer 树形DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2196 思路: 一看就是一道树形DP的题目,对于一个节点来说,到它的最远距离的路径可能来于子树,也可能来 ...

  4. HDU-2196-Computer(树上DP)

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=2196 题意: A school bought the first computer some time ...

随机推荐

  1. Sqlserver2012 sa账户登录添加其他账户

    1.添加admin账户的设置 2.另外 sa登录后,点击服务器名,右键->属性->安全性 的设置: 3.其次是Sqlserver配置管理器,SQL Server服务需要重启: SQL Se ...

  2. 从零开始学习GDI+ (三) 画笔与画刷

  3. 洛谷 P2015 二叉苹果树 题解

    题面 裸的树上背包: 设f[u][i]表示在以u为子树的树种选择i条边的最大值,则:f[u][i]=max(f[u][i],f[u][i-j-1]+f[v][k]+u到v的边权); #include ...

  4. springboot2.0和Druid整合配置数据源

    1. idea使用spring 初始化工具初始化springboot项目(要选中web) 下一步,下一步 2. 在pom.xml中,引入Druid连接池依赖: <dependency> & ...

  5. 2-django配置

    一.settings.py配置 1.时区配置 现在看到的界面是英文的,将 LANGUAGE_CODE = 'en-us' 改为 LANGUAGE_CODE = 'zh-Hans '就可以看到如下界面 ...

  6. python__基础数据类型

    字符串和常用数据结构 使用字符串 第二次世界大战促使了现代电子计算机的诞生,当初的想法很简单,就是用计算机来计算导弹的弹道,因此在计算机刚刚诞生的那个年代,计算机处理的信息主要是数值,而世界上的第一台 ...

  7. Python 集合的各种操作 数学运算 关系操作 增删改查 生成式

    # 集合是无序的 是可变的 不能重复 允许数学运算 分散存储 # 创建# collegel = {'哲学','经济学','法学','教育学'}## # {'教育学', '经济学', '法学', '哲学 ...

  8. 机器学习-非线性回归(Logistic Regression)及应用

    1. 概率 1.1 定义:概率(Probability):对一件事情发生的可能性的衡量. 1.2 范围:0 <= P <= 1 1.3 计算方法: 1.3.1 根据个人置信 1.3.2 根 ...

  9. php打开csv

    <?php $fh=fopen("a.csv","r");//这里我们只是读取数据,所以采用只读打开文件流 $arr=fgetcsv($fh);//这个函 ...

  10. 一键安装cobbler脚本

    #!/bin/bash # # Install Cobbler(Kickstart) Tools / # Created by OceanHo(gzhehai@foxmail.com) AT -- # ...