题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2196

思路:

一看就是一道树形DP的题目,对于一个节点来说,到它的最远距离的路径可能来于子树,也可能来源于经过父亲节点的路径,所以我们两次DFS即可。

第一次DFS自底向上(从叶节点开始),依次求出每个节点的在其子树上的最大距离和次大距离

第二次DFS自顶向下(从根节点开始),通过比较经过父亲节点的路径的最大距离和来源于子树的最大距离比较然后更新最大距离

至于为什么要保存次大距离呢??因为经过父亲节点的最大距离可能刚好经过当前的孩子节点,那么我们就只能通过当前孩子到父亲节点的距离加上经过父亲节点的路径次大值和当前节点的位于其子树的路径的最大距离的比较来更新最大距离咯。

虽然思路还是比较清晰的,自己实现起来还是比较难的。。。。

代码如下:

 #include<cstdlib>
#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std;
#define MAX 10010
class node
{
public:
int to;
int w;
int next; };
node edge[*MAX];
int head[MAX];
int tol;
int maxn[MAX];
int smaxn[MAX];
int m_id[MAX];
int sm_id[MAX];
int vis[MAX];
void init()
{
memset(head,-,sizeof(head));
memset(maxn,,sizeof(maxn));
memset(smaxn,,sizeof(smaxn));
memset(vis,,sizeof(vis));
tol=;
}
void Build_Tree(int u,int v,int w)
{
edge[tol].to=v;
edge[tol].w=w;
edge[tol].next=head[u];
head[u]=tol++;
}
void dfs1(int root,int parent)
{
vis[root]=;
for(int i=head[root];i!=-;i=edge[i].next)
{
if(vis[edge[i].to]) continue;
int son=edge[i].to;
dfs1(son,root);
int len=edge[i].w;
if(smaxn[root]<maxn[son]+len)
{
smaxn[root]=maxn[son]+len;
sm_id[root]=son;
if(smaxn[root]>maxn[root])
{
swap(smaxn[root],maxn[root]);
swap(sm_id[root],m_id[root]);
}
}
}
}
void dfs2(int root ,int parent)
{
for(int i=head[root];i!=-;i=edge[i].next)
{
if(edge[i].to==parent) continue;
int son=edge[i].to;
if(m_id[root]==son)
{
if(edge[i].w+smaxn[root]>smaxn[son])
{
smaxn[son]=edge[i].w+smaxn[root];
sm_id[son]=root;
if(smaxn[son]>maxn[son])
{
swap(smaxn[son],maxn[son]);
swap(sm_id[son],m_id[son]);
}
}
}
else
{
if(edge[i].w+maxn[root]>smaxn[son])
{
smaxn[son]=edge[i].w+maxn[root];
sm_id[son]=root;
if(smaxn[son]>maxn[son])
{
swap(smaxn[son],maxn[son]);
swap(m_id[son],sm_id[son]);
}
}
}
dfs2(son,root);
} }
int n;
int main()
{
while(scanf("%d",&n)!=EOF)
{
init();
for(int i=;i<=n;i++)
{
int u,w;
scanf("%d%d",&u,&w);
Build_Tree(i,u,w);
Build_Tree(u,i,w);
}
dfs1(,-);
dfs2(,-);
for(int i=;i<=n;i++)
cout<<maxn[i]<<endl; }
return ;
}

hdu2196Computer 树形DP的更多相关文章

  1. poj3417 LCA + 树形dp

    Network Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4478   Accepted: 1292 Descripti ...

  2. COGS 2532. [HZOI 2016]树之美 树形dp

    可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...

  3. 【BZOJ-4726】Sabota? 树形DP

    4726: [POI2017]Sabota? Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 128  Solved ...

  4. 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)

    题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...

  5. 树形DP

    切题ing!!!!! HDU  2196 Anniversary party 经典树形DP,以前写的太搓了,终于学会简单写法了.... #include <iostream> #inclu ...

  6. BZOJ 2286 消耗战 (虚树+树形DP)

    给出一个n节点的无向树,每条边都有一个边权,给出m个询问,每个询问询问ki个点,问切掉一些边后使得这些顶点无法与顶点1连接.最少的边权和是多少.(n<=250000,sigma(ki)<= ...

  7. POJ2342 树形dp

    原题:http://poj.org/problem?id=2342 树形dp入门题. 我们让dp[i][0]表示第i个人不去,dp[i][1]表示第i个人去 ,根据题意我们可以很容易的得到如下递推公式 ...

  8. hdu1561 The more, The Better (树形dp+背包)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1561 思路:树形dp+01背包 //看注释可以懂 用vector建树更简单. 代码: #i ...

  9. bzoj2500: 幸福的道路(树形dp+单调队列)

    好题.. 先找出每个节点的树上最长路 由树形DP完成 节点x,设其最长路的子节点为y 对于y的最长路,有向上和向下两种情况: down:y向子节点的最长路g[y][0] up:x的次长路的g[x][1 ...

随机推荐

  1. NGINX下配置CACHE-CONTROL

    HTTP协议的Cache -Control指定请求和响应遵循的缓存机制.在请求消息或响应消息中设置 Cache-Control并不会影响另一个消息处理过程中的缓存处理过程.请求时的缓存指令包括no-c ...

  2. Windows运行命令大全

    inetmgr   启动IIS控制台winver 检查Windows版本 wmimgmt.msc 打开Windows管理体系结构(wmi) wupdmgr Windows更新程序 wscript Wi ...

  3. 深度学习实践系列(2)- 搭建notMNIST的深度神经网络

    如果你希望系统性的了解神经网络,请参考零基础入门深度学习系列,下面我会粗略的介绍一下本文中实现神经网络需要了解的知识. 什么是深度神经网络? 神经网络包含三层:输入层(X).隐藏层和输出层:f(x) ...

  4. iOS中书写代码规范35条小建议

    1.精简代码, 返回最后一句的值,这个方法有一个优点,所有的变量都在代码块中,也就是只在代码块的区域中有效,这意味着可以减少对其他作用域的命名污染.但缺点是可读性比较差 NSURL *url = ({ ...

  5. POJ2352Stars【树状数组】

    Stars Description Astronomers often examine star maps where stars are represented by points on a pla ...

  6. 手机自动化测试:appium源码分析之bootstrap十一

    手机自动化测试:appium源码分析之bootstrap十一   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣 ...

  7. Myeclipse8.5开发-程序发布

    1.新建focus.xml文件.   2.添加如下内容   <Context path="/focus" docBase="F:\Workspaces\MyEcli ...

  8. ATM取款小项目

    项目要求: 1.用户需要从控制台输入账号密码,账号或者密码不正确报异常 2.每日取款的金额有限制(100,30000),否则报异常 3.每次取款都要有记录,并在下一次取款时显示出来 思路: 1.先在& ...

  9. 怎样配置mysql_installer_community_V5.6........_setup的数据库?

    直接访问查看如下路径就可以根据方法匹配 http://jingyan.baidu.com/album/c35dbcb0f1b1448916fcbcc7.html

  10. NestedScrollView嵌套RecycleView 滑动 实现上滑隐藏 下滑显示头部效果

    废了好大的劲才弄好的,记下来 方便以后查看 public class MainActivity extends AppCompatActivity { private RecyclerView mRe ...