HDU2196computer
就是求每个点为起始点的最长链的长度。
写一下各个数组的意思吧。
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的更多相关文章
- HDU2196computer(树上最远距离 + DP)
Computer Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- HDU2196-Computer
原题连接: http://acm.hdu.edu.cn/showproblem.php?pid=2196 思路: 好了,无敌了,经过昨晚4个钟头+今上午1个小时的奋战,这题终于被我AC了 收获的确是不 ...
- hdu2196Computer 树形DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2196 思路: 一看就是一道树形DP的题目,对于一个节点来说,到它的最远距离的路径可能来于子树,也可能来 ...
- HDU-2196-Computer(树上DP)
链接: http://acm.hdu.edu.cn/showproblem.php?pid=2196 题意: A school bought the first computer some time ...
随机推荐
- 关于ElementUI中日期选择器时间选择范围限制
1.组件代码 <el-date-picker v-model="value1" type="date" placeholder="选择日期&qu ...
- AttributeError: 'dict' object has no attribute 'status_code'
前端AJAX请求数据,提示错误:“AttributeError: 'dict' object has no attribute 'status_code'”. 原因:是提示返回对象dict没有“sta ...
- 手撕ES6--Promise
手撕ES6--Promise:https://www.jianshu.com/p/0925eae38d2c 手写一个Promise,附源码分析:https://blog.csdn.net/weixin ...
- Go语言基本数据类型(四)
Go语言基本数据类型主要包含:bool,number,string 布尔类型 go中的布尔类型,只能是 true 和 false,例如:var b bool = true 数字类型 整型 类型 描述 ...
- Being a Good Boy in Spring Festival
Being a Good Boy in Spring Festival Problem Description 一年在外 父母时刻牵挂春节回家 你能做几天好孩子吗寒假里尝试做做下面的事情吧 陪妈妈逛一 ...
- POJ 3585 Accumulation Degree 题解
题面 一句话题意:找一个点使得,使得从这个点出发作为源点,发出的流量最大,输出这个最大的流量 这道题是换根法+二次扫描的模板: 首先若确定1为原点,那么可以写出dp方程:当v的度是1时, g[u]+= ...
- C# 从集合A中取出集合B中不包含的数据(根据ID判断),并添加到集合B中
从一个集合A中取出另一个集合B中不包含的数据,并添加到集合B中 private void button2_Click(object sender, EventArgs e) { var ListA = ...
- Java学习:通过Scanner读取文件
Scanner不仅能够读取用户的键盘输入,还可以读取文件输入. 需要在创建Scanner对象的时候传入一个File对象作为参数.代码如下: import java.util.Scanner; impo ...
- 多线程之继承Thread类及多线程内存分析
*创建多线程的一种方式:继承Thread类 * java.lang.Thread是描述多线程的类,要实现多线程程序,一种方式就是继承Thread类 * 1.创建一个类Mythread让其extends ...
- 绑定异常pom
绑定:. <build> <resources> <resource> <directory>src/main/resources</direct ...