题目链接:https://vjudge.net/problem/HDU-2196

题意:给出一棵树,求每个结点可以到达的最远距离。

思路:

  如果求得是树上最长距离,两次bfs就行。但这里求的是所有点的最远距离,树形dp的经典题,想了一个小时,还是dp做得太少。分析可得对任意结点u,它的最长距离要么是向下延伸的最长距离,要不向上延伸的最长距离。

  我们用dp[u][0]表示节点u向下(子结点)的最长距离,pt[u]记录该最长距离经过的第一个子结点编号,比如最长距离经过u->v,那么pt[u]=v。dp[u][1]记录u向下的次短距离,dp[u][0]、dp[u][1]通过一次dfs可以得到,该dfs是由子结点得到父结点的信息。

  dp[u][2]记录节点u向上(父结点)的最长距离,假设u的父结点为k,分两种情况考虑:

    1.pt[k]=u(k向下的最长路经过u):dp[u][2]=wku+max(dp[k][1],dp[k][2]),即父结点走次长距离,还是向上距离。

    2.pt[k]!=u:dp[u][2]=wku+max(dp[k][0],dp[k][2]),即父结点走最长距离,还是向上距离。

  对每个结点,结果为max(dp[u][0],dp[u][2])。

AC代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std; const int maxn=;
struct node{
int v,w,nex;
}edge[maxn];
int n,dp[maxn][],pt[maxn],head[maxn],cnt; void adde(int u,int v,int w){
edge[++cnt].v=v;
edge[cnt].w=w;
edge[cnt].nex=head[u];
head[u]=cnt;
} void dfs1(int u){
dp[u][]=dp[u][]=pt[u]=;
for(int i=head[u];i;i=edge[i].nex){
int v=edge[i].v,w=edge[i].w;
dfs1(v);
if(dp[v][]+w>=dp[u][]){
pt[u]=v;
dp[u][]=dp[u][];
dp[u][]=dp[v][]+w;
}
else if(dp[v][]+w>dp[u][])
dp[u][]=dp[v][]+w;
}
} void dfs2(int u){
for(int i=head[u];i;i=edge[i].nex){
int v=edge[i].v,w=edge[i].w;
if(pt[u]==v) dp[v][]=w+max(dp[u][],dp[u][]);
else dp[v][]=w+max(dp[u][],dp[u][]);
dfs2(v);
}
} int main(){
while(~scanf("%d",&n)){
cnt=;
memset(head,,sizeof(head));
for(int i=;i<=n;++i){
int u,w;
scanf("%d%d",&u,&w);
adde(u,i,w);
}
dfs1();
dfs2();
for(int i=;i<=n;++i)
printf("%d\n",max(dp[i][],dp[i][]));
}
return ;
}

hdoj2196(树形dp,树的直径)的更多相关文章

  1. HDU 2196.Computer 树形dp 树的直径

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

  2. hdu 4607 树形dp 树的直径

    题目大意:给你n个点,n-1条边,将图连成一棵生成树,问你从任意点为起点,走k(k<=n)个点,至少需要走多少距离(每条边的距离是1): 思路:树形dp求树的直径r: a:若k<=r+1 ...

  3. computer(树形dp || 树的直径)

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

  4. VIJOS1476旅游规划[树形DP 树的直径]

    描述 W市的交通规划出现了重大问题,市政府下决心在全市的各大交通路口安排交通疏导员来疏导密集的车流.但由于人员不足,W市市长决定只在最需要安排人员的路口安放人员.具体说来,W市的交通网络十分简单,它包 ...

  5. POJ 3162.Walking Race 树形dp 树的直径

    Walking Race Time Limit: 10000MS   Memory Limit: 131072K Total Submissions: 4123   Accepted: 1029 Ca ...

  6. Computer(HDU2196+树形dp+树的直径)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2196 题目: 题意:有n台电脑,每台电脑连接其他电脑,第i行(包括第一行的n)连接u,长度为w,问你每 ...

  7. poj3162 树形dp|树的直径 + 双单调队列|线段树,好题啊

    题解链接:https://blog.csdn.net/shiqi_614/article/details/8105149 用树形dp是超时的,, /* 先求出每个点可以跑的最长距离dp[i][0|1] ...

  8. hdu-2169 Computer(树形dp+树的直径)

    题目链接: Computer Time Limit: 1000/1000 MS (Java/Others)     Memory Limit: 32768/32768 K (Java/Others) ...

  9. 树形DP+树状数组 HDU 5877 Weak Pair

    //树形DP+树状数组 HDU 5877 Weak Pair // 思路:用树状数组每次加k/a[i],每个节点ans+=Sum(a[i]) 表示每次加大于等于a[i]的值 // 这道题要离散化 #i ...

  10. [HDU 5293]Tree chain problem(树形dp+树链剖分)

    [HDU 5293]Tree chain problem(树形dp+树链剖分) 题面 在一棵树中,给出若干条链和链的权值,求选取不相交的链使得权值和最大. 分析 考虑树形dp,dp[x]表示以x为子树 ...

随机推荐

  1. MFC的静态链接、动态链接

    项目属性页面可以查看更改编译方式,推荐使用静态编译.也可以在创建MFC项目时选择静态编译. 标准Windows库,使用的是系统API,Win32是面向API的编程平台.Win32项目使用的是此编译方式 ...

  2. python 鼠标输入

    import win32con import win32api import time win32api.SetCursorPos([,]) # 设置鼠标位置 time.sleep(0.1) #win ...

  3. Django基础之Session操作

    1. 创建一个示例 1.1 第一步 首先创建一个django项目,创建app01, 连接数据库,做好准备工作. 然后在templates目录下创建两个html: login.html负责登录页面: b ...

  4. mybatis-puls 字段为null时候的更新问题

    在mybatis-puls重设置的全局更新策略 为null的字段忽略更新.但是在某些业务需求下面,可能需要某些字段更新为null值.那么改如何设置 1, 在你的实体属性上面单独添加需要更新nu l l ...

  5. Cannot find ./catalina.sh The file is absent or does not have execute permission This file is nee Linux上tomcat无法正常启动

    上传了个tomcat7的压缩包上linux服务器,解压后,想直接启动,发现报错: Cannot find ./catalina.sh The file is absent or does not ha ...

  6. docker打包项目部署

    1.首先在本地安装docker,步骤可参考https://www.cnblogs.com/conswin/p/11055853.html 2.在对应项目目录下增加Dockerfile文件,其内容可参考 ...

  7. 20175329&20175313&20175318 2019-2020 《信息安全系统设计基础》实验三

    20175329&20175313&20175318 2019-2020 <信息安全系统设计基础>实验三

  8. Python 使用工具总结

    1.比较两个list大小:operator模块 operator.lt(a, b) operator.le(a, b) operator.eq(a, b) operator.ne(a, b) oper ...

  9. (转载)完成端口(CompletionPort)详解 - 手把手教你玩转网络编程系列之三

    转自:http://blog.csdn.net/piggyxp/article/details/6922277 前 言 本系列里完成端口的代码在两年前就已经写好了,但是由于许久没有写东西了,不知该如何 ...

  10. [MyBatis]向MySql数据库插入一千万条数据 批量插入用时6分 之前时隐时现的异常不见了

    本例代码下载:https://files.cnblogs.com/files/xiandedanteng/InsertMillionComparison20191012.rar 这次实验的环境仍然和上 ...