HDU 2196 Computer (树dp)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2196
给你n个点,n-1条边,然后给你每条边的权值。输出每个点能对应其他点的最远距离是多少。
树形dp,2次dfs。
第一次 dfs1自低向上回溯更新:dp[i][0]表示从底部到i点的最远距离,dp[i][1]则表示次远距离 (dp[i][2]时用到)
dp[i][0] = max(dp[i][0], dp[i的子节点][0] + edge);
第二次 dfs2自顶向下顺着更新:dp[i][2]表示从前部到i点的最远距离,顺着下来。
1)要是dp[i父节点][0]由i点转移 :dp[i][2] = max(dp[i父节点][2] , dp[i父节点][1]) + edge;
当然只有一条边的话就:dp[i][2] = dp[i父节点][2];
2)否则 :dp[i][2] = max(dp[i父节点][2] , dp[i父节点][0]) + edge;
//HDU 2196
//#pragma comment(linker, "/STACK:102400000, 102400000")
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <vector>
#include <cmath>
#include <ctime>
#include <list>
#include <set>
#include <map>
using namespace std;
typedef long long LL;
typedef pair <int, int> P;
const int N = 1e5 + ;
struct Edge {
int next, to, cost;
}edge[N << ];
int dp[N][], head[N], cnt; inline void add(int u, int v, int c) {
edge[cnt].to = v;
edge[cnt].next = head[u];
edge[cnt].cost = c;
head[u] = cnt++;
} void dfs1(int u, int p) {
for(int i = head[u]; ~i; i = edge[i].next) {
int v = edge[i].to;
if(v == p)
continue;
dfs1(v, u);
if(edge[i].cost + dp[v][] >= dp[u][]) {
dp[u][] = dp[u][];
dp[u][] = dp[v][] + edge[i].cost;
} else {
dp[u][] = max(dp[v][] + edge[i].cost, dp[u][]);
}
}
} void dfs2(int u, int p, int val) {
for(int i = head[u]; ~i; i = edge[i].next) {
int v = edge[i].to;
if(v == p)
continue;
if(dp[u][] == dp[v][] + edge[i].cost) {
dp[v][] = max(dp[u][], val) + edge[i].cost;
} else {
dp[v][] = max(dp[u][], val) + edge[i].cost;
}
dfs2(v, u, dp[v][]);
}
} int main()
{
int n, u, v;
while(~scanf("%d", &n)) {
memset(head, -, sizeof(head));
cnt = ;
for(int i = ; i <= n; ++i) {
scanf("%d %d", &u, &v);
add(i, u, v);
add(u, i, v);
}
memset(dp, , sizeof(dp));
dfs1(, -);
dfs2(, -, );
for(int i = ; i <= n; ++i) {
printf("%d\n", max(dp[i][], dp[i][]));
}
}
return ;
}
HDU 2196 Computer (树dp)的更多相关文章
- HDU 2196.Computer 树形dp 树的直径
Computer Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- HDU 2196 Computer 树形DP经典题
链接:http://acm.hdu.edu.cn/showproblem.php? pid=2196 题意:每一个电脑都用线连接到了还有一台电脑,连接用的线有一定的长度,最后把全部电脑连成了一棵树,问 ...
- hdu 2196 Computer(树形DP)
Computer Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- hdu 2196 Computer 树的直径
Computer Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem ...
- HDU 2196 Computer 树形DP 经典题
给出一棵树,边有权值,求出离每一个节点最远的点的距离 树形DP,经典题 本来这道题是无根树,可以随意选择root, 但是根据输入数据的方式,选择root=1明显可以方便很多. 我们先把边权转化为点权, ...
- hdu 2196 Computer 树形dp模板题
Computer Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- hdu 2196 Computer(树形DP经典)
Computer Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- 题解报告:hdu 2196 Computer(树形dp)
Problem Description A school bought the first computer some time ago(so this computer's id is 1). Du ...
- HDU 2196 Computer (树上最长路)【树形DP】
<题目链接> 题目大意: 输出树上每个点到其它点的最大距离. 解题分析: 下面的做法是将树看成有向图的做法,计算最长路需要考虑几种情况. dp[i][0] : 表示以i为根的子树中的结点与 ...
随机推荐
- HDU 1244 Max Sum Plus Plus Plus
虽然这道题看起来和 HDU 1024 Max Sum Plus Plus 看起来很像,可是感觉这道题比1024要简单一些 前面WA了几次,因为我开始把dp[22][maxn]写成dp[maxn][2 ...
- css3 切换贞动画的效果,仿gif效果
/*---第一组动画---*/ .cartonGif_1{ position: absolute; display: block; background:url("img/haihangzh ...
- Spring Transaction属性之Propagation
spring Transaction中有一个很重要的属性:Propagation.主要用来配置当前需要执行的方法,与当前是否有transaction之间的关系. 我晓得有点儿抽象,这也是为什么我想要写 ...
- IOS中控制器的重要方法使用
1.屏幕即将旋转的时候调用(控制器监控屏幕旋转) - (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfac ...
- 850 USB 烧录模式
/************************************************************************* * 850 USB 烧录模式 * 说明: * 本文 ...
- jQuery学习备忘
jQuery对象转换成DOM对象 var #cr = $("#cr"); //jQuery对象 var cr = $cf[0]; //DOM对象 alert(cr.checked) ...
- web app 页面旋转整体样式问题
$(window).bind("orientationchange", function (event) { if (event.orientation) { //portrait ...
- MVC2.0前置
.NET MVC执行过程: 1.网址路由比对 2.执行Controller与Action 3.执行View并返回结果 在使用MVC中是由IgnoreRoute()辅助方法对比成功的,会导致程序直接跳离 ...
- linux ubuntu 安装jdk
junluobj@junluobj:~$sudo mkdir /usr/lib/jvmwww.linuxidc.com@linuxidc:~$tar zvxf jdk-8u20-linux-x64.t ...
- [Everyday Mathematics]20150226
设 $z\in\bbC$ 适合 $|z+1|>2$. 试证: $$\bex |z^3+1|>1. \eex$$