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

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

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. 【基本优化实践】【1.4】tempdb优化

    [1]tempdb介绍 tempdb全局存储内部对象,用户对象,临时表,临时对象,以及SQL Server操作创建的存储过程.每个数据库实例只有一个tempdb,所以可能存在性能以及磁盘空间瓶颈. 各 ...

  2. HNUST-1148 ACM ranking rules(简单模拟)

    1148: ACM ranking rules 时间限制: 1 Sec  内存限制: 128 MB提交: 16  解决: 12[提交][状态][讨论版] 题目描述 ACM contests, like ...

  3. css3 加载动画

    代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8& ...

  4. linux下重启tomcat命令

    在Linux系统下,重启Tomcat使用命令操作的! 首先,进入Tomcat下的bin目录 cd /usr/local/tomcat/bin 使用Tomcat关闭命令 ./shutdown.sh 查看 ...

  5. intellij 编译 springmvc+hibernate+spring+maven 找不到hbm.xml映射文件

    1. 错误信息 Invocation of init method failed; nested exception is org.hibernate.MappingNotFoundException ...

  6. python子进程模块subprocess详解

    subprocess--子进程管理器一.subprocess 模块简介subprocess最早是在2.4版本中引入的.subprocess模块用来生成子进程,并可以通过管道连接它们的输入/输出/错误, ...

  7. 学习-Pytest(三)setup/teardown

    1. 用例运行级别 模块级(setup_module/teardown_module)开始于模块始末,全局的 函数级(setup_function/teardown_function)只对函数用例生效 ...

  8. 5月Linux市场Steam 份额在增长

    随着新的一个月的开始,Valve公布了上个月的软件/硬件调查数据.在2019年5月,Steam Linux的使用率按百分比略微上升. 上个月,运行Linux的Steam用户比例(根据有争议的Steam ...

  9. byteArray转换为double,int

    /*将int转为低字节在前,高字节在后的byte数组   b[0] = 11111111(0xff) & 01100001   b[1] = 11111111(0xff) & (n & ...

  10. Fuel9.0部署

    一.安装环境(准备工作): 1. 所需物理主机的要求如下 内存:8GB+,推荐16GB:(少于8GB的就免谈了) 磁盘:500GB+: 物理机OS:ubuntu-desktop-amd64 14.04 ...