http://www.cnblogs.com/kuangbin/archive/2012/08/28/2659915.html

求每个节点到叶子节点的最长距离

需要保存每个节点到叶子节点距离的最大值和次大值。第一次dfs求出到下面叶子节点的最大值,第二次dfs更新从父节点过来的最大值。

#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <stack>
#include <queue>
#include <cctype>
#include <vector>
#include <iterator>
#include <set>
#include <map>
#include <sstream>
using namespace std; #define mem(a,b) memset(a,b,sizeof(a))
#define pf printf
#define sf scanf
#define spf sprintf
#define pb push_back
#define debug printf("!\n")
#define MAXN 20000+5
#define MAX(a,b) a>b?a:b
#define blank pf("\n")
#define LL long long
#define ALL(x) x.begin(),x.end()
#define INS(x) inserter(x,x.begin())
#define pqueue priority_queue
#define INF 0x3f3f3f3f #define ls (rt<<1)
#define rs (rt<<1|1) int n,m; int ptr = ,head[MAXN],a[MAXN],dp[MAXN][],vis[MAXN]; int mx[MAXN],mx2[MAXN],vx[MAXN],vx2[MAXN]; struct node
{
int y,val,next;
}tree[MAXN]; void add(int fa,int son,int val)
{
tree[ptr].y = son;
tree[ptr].val = val;
tree[ptr].next = head[fa];
head[fa] = ptr++;
} void cg(int &x,int &y)
{
int tmp = x;
x = y;
y = tmp;
} void dfs(int root,int fa)
{
for(int i=head[root];i!=-;i=tree[i].next)
{
int y = tree[i].y;
if(y == fa) continue;
dfs(y,root);
if(mx2[root] < mx[y]+tree[i].val)
{
mx2[root] = mx[y]+tree[i].val;
vx2[root] = y;
if(mx2[root]>mx[root])
{
swap(mx[root],mx2[root]);
swap(vx[root],vx2[root]);
}
}
}
} void dfs2(int root,int fa)
{
for(int i=head[root];i!=-;i=tree[i].next)
{
int y = tree[i].y;
if(y == fa) continue;
if(y == vx[root])
{
if(tree[i].val + mx2[root] > mx2[y])
{
mx2[y] = tree[i].val + mx2[root];
vx2[y] = root;
if(mx2[y]>mx[y])
{
swap(mx[y],mx2[y]);
swap(vx[y],vx2[y]);
}
}
}
else
{
if(tree[i].val + mx[root] > mx2[y])
{
mx2[y] = tree[i].val + mx[root];
vx2[y] = root;
if(mx2[y]>mx[y])
{
swap(mx[y],mx2[y]);
swap(vx[y],vx2[y]);
}
}
}
dfs2(y,root);
}
} int main()
{
int i,j,t,kase=;
while(~sf("%d",&n))
{
mem(tree,);
mem(head,-);
mem(mx,);
mem(mx2,);
mem(vx,);
mem(vx2,);
ptr = ;
int x,y;
for(i=;i<=n;i++)
{
sf("%d%d",&x,&y);
add(x,i,y);
add(i,x,y);
}
dfs(,-);
dfs2(,-);
for(i=;i<=n;i++) pf("%d\n",mx[i]);
}
return ;
}

hdu 2196 叶子节点最长距离(树DP)的更多相关文章

  1. HDU 3016 Man Down (线段树+dp)

    HDU 3016 Man Down (线段树+dp) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  2. hdu 2196(方法1:经典树形DP+方法2:树的直径)

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

  3. hdu 5773 The All-purpose Zero 线段树 dp

    The All-purpose Zero 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5773 Description ?? gets an seq ...

  4. HDU 4719Oh My Holy FFF 线段树+DP

    /* ** 日期: 2013-9-12 ** 题目大意:有n个数,划分为多个部分,假设M份,每份不能多于L个.每个数有一个h[i], ** 每份最右边的那个数要大于前一份最右边的那个数.设每份最右边的 ...

  5. poj 3162 树DP+单调队列

    http://acm.hust.edu.cn/vjudge/problem/11552 http://blog.csdn.net/woshi250hua/article/details/7727677 ...

  6. HDU 2196树形DP(2个方向)

    HDU 2196 [题目链接]HDU 2196 [题目类型]树形DP(2个方向) &题意: 题意是求树中每个点到所有叶子节点的距离的最大值是多少. &题解: 2次dfs,先把子树的最大 ...

  7. POJ 2342 Anniversary party (树dp)

    题目链接:http://poj.org/problem?id=2342 有n个人,每个人有活跃值.下面n-1行u和v表示u的上司是v,有直接上司和下属的关系不能同时参加party,问你party最大的 ...

  8. HDU 2196 Computer (树dp)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2196 给你n个点,n-1条边,然后给你每条边的权值.输出每个点能对应其他点的最远距离是多少 ...

  9. HDU 4267 线段树 离散点区间更新, 自叶子节点至根单点查询

    题意: n个数字 下面n个数字表示数列 2个操作 1 [u, v]  k  add [u,v ]区间 (u点要计算)每隔k个位置,该数字+add 2 pos 询问 pos下标的值(下标从1开始) 思路 ...

随机推荐

  1. 题解 CF500D 【New Year Santa Network】

    题目链接 这道题首先是要看看该如何化简,先把三元组化成二元组. 之后统计经过某条边的 次数$*$权值  的和. 最后除以总基数 $tot$ 其中,每条边被计算的次数为 子树的点数$*$非子树的点数 ( ...

  2. loj#6437. 「PKUSC2018」PKUSC(计算几何)

    题面 传送门 题解 计算几何的东西我好像都已经忘光了-- 首先我们可以把原问题转化为另一个等价的问题:对于每一个敌人,我们以原点为圆心,画一个经过该点的圆,把这个圆在多边形内部的圆弧的度数加入答案.求 ...

  3. Web Service入门

    [IT168 技术文档] 一.什么是Web Service?     Web Service是构建互联网分布式系统的基本部件.Web Services 正成为企业应用集成(Enterprise App ...

  4. 【离散数学】 SDUT OJ 1.3按位AND和按位OR

    1.3按位AND和按位OR Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description 已知长度为 ...

  5. Android---16进制与字节数组

    16进制字符串与字节数组进行转换 package string; import java.util.Arrays; /** * byte[]与16进制字符串相互转换 * * @date:2017年4月 ...

  6. 远程诊断DoIP

    目录 远程诊断DoIP Part 1: General information and use case definition DoIP诊断网络架构 诊断连接场景 DoIP之通信建立 DoIP中的一些 ...

  7. 15. window.onload和$(function() { } )的区别

    window.onload和$(function() { } )的区别 1)执行时机不一样 $(function() { } )是在dom结构创建完成以后就执行,window.onload是在整个页面 ...

  8. docker: Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled (Client.Timeout exceeded while awaiting headers).

    docker: Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled ...

  9. 洛谷 P3695 CYaRon!语 题解 【模拟】【字符串】

    大模拟好啊! 万一远古计算机让我写个解释器还真是得爆零了呢. 题目背景 「千歌です」(我是千歌).「曜です」(我是曜).「ルビィです」(我是露比).「3人合わせて.We are CYaRon! よろし ...

  10. C# Task超时规则

    需要知道以下的知识 正规的骚操作:https://stackoverflow.com/questions/4238345/asynchronously-wait-for-taskt-to-comple ...