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. 八大排序算法的python实现(二)希尔排序

    代码: #coding:utf-8 #author:徐卜灵 # 希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名. # 希尔排序,也称递减增量排序算法, ...

  2. 使用window.name 进行数据跨域传递

    其中要点, Stpe1,浏览器在Iframe中加载一个异域的页面,这个页面返回 <script>window.name="任何数据"</script>,这时 ...

  3. SDK,JDk,Unity打包安卓apk

    SDK:软件开发工具包(缩写:SDK.外语全称:Software Development Kit)一般都是一些软件工程师为特定的软件包.软件框架.硬件平台.操作系统等建立应用软件时的开发工具的集合. ...

  4. Android 滚动视图(ScollView)

    1.介绍 2.使用技巧 3.xml文件代码 <?xml version="1.0" encoding="utf-8"?> <LinearLay ...

  5. C++_类继承3-动态联编和静态联编

    程序调用函数时,将使用哪个可执行代码块呢?编译器负责回答这个问题. 将源代码中的函数调用解释为特定的函数代码块被称为函数名联编(binding). 在C语言中,这非常简单,因为每个函数名对应一个不同的 ...

  6. bcdedit /copy {current} /d "xxx" 报错,提示找不到系统文件

    步骤: cd c:windows/system32 bcdedit /set {default} osdevice boot bcdedit /set {default} device boot bc ...

  7. 2.16 关于python/numpy

  8. CNN 卷积神经网络结构

    cnn每一层会输出多个feature map, 每个Feature Map通过一种卷积滤波器提取输入的一种特征,每个feature map由多个神经元组成,假如某个feature map的shape是 ...

  9. codeforces 1100F Ivan and Burgers 线性基 离线

    题目传送门 题意: 给出 n 个数,q次区间查询,每次查询,让你选择任意个下标为 [ l , r ] 区间内的任意数,使这些数异或起来最大,输出最大值. 思路:离线加线性基. 线性基学习博客1 线性基 ...

  10. C++ GUI Qt4编程(06)-2.3sort

    1. 使用Qt设计师创建Sort对话框. 2. sortdialog.cpp /**/ #include "sortdialog.h" SortDialog::SortDialog ...