HDU 2196 Computer (树上最长路)【树形DP】
<题目链接>
题目大意:
输出树上每个点到其它点的最大距离。
解题分析:
下面的做法是将树看成有向图的做法,计算最长路需要考虑几种情况。
dp[i][0] : 表示以i为根的子树中的结点与i的最大距离
dp[i][1] : 表示以i为根的子树中的结点与i的次大距离
dp[i][2] : 表示i往父亲节点方向走的最大距离
第一就是点 i 在以点 i 为根的子树中的最长距离,这个可以直接在点 i 的子树中求得;
第二就是点 i 朝父亲节点方向的最长距离,这个距离分为三种:
1) 点 i 在以 fa 为根的子树中的最长路径上,这时的它朝fa 的最长距离(但是不超过fa的子树继续向上,即只在fa的子树的其它分支进行操作)为 cost<u,fa> + 以fa 为根的子树中的次长路;
2)点 i 不在以fa 为根的子树的最长路径上,这时它朝 fa 的最长距离为(但是不超过fa 的子树继续向上,即只在fa的子树的其它分支进行操作), cost<u,fa> + fa 子树中的最长路;
3)点 i 向 fa 的 fa 的子树进行扩展比较,所以需要和dp[fa][2] 比较。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int N = 1e4 +;
int dp[N][];
struct Node{
int to,next,cost;
}edge[N]; int n,cnt,head[N];
void init(){
cnt=;
memset(head,-,sizeof(head));
}
void addedge(int u,int v,int w){
edge[cnt].to=v,edge[cnt].cost=w,edge[cnt].next=head[u];
head[u]=cnt++;
}
void dfs1(int u){
int ans1=,ans2=;
for(int i=head[u];~i;i=edge[i].next){
int v=edge[i].to,cost=edge[i].cost;
dfs1(v);
int res=dp[v][]+cost;
if(res>=ans1){
ans2=ans1; //ans1记录最长路,ans2记录次长路
ans1=res;
}else if(res>ans2) ans2=res;
}
dp[u][]=ans1; //dp[u][0]为以u为根的子树的最长路
dp[u][]=ans2; //dp[u][1]为以u为根的子树的次长路
}
void dfs2(int fa){
for(int i=head[fa];~i;i=edge[i].next){
int v=edge[i].to,cost=edge[i].cost;
dp[v][]=max(dp[fa][],dp[v][]+cost == dp[fa][]? dp[fa][]:dp[fa][])+cost;
//dp[fa][2]表示向父亲方向走的最长路; 按v是否在以fa为根的子树中的最长路径上分类讨论,dp[v][2]有两种选择
//相当于,上面的式子考虑了v向fa方向走最长路的三种情况
dfs2(v);
}
}
int main(){
while(~scanf("%d",&n)){
init();
for(int i=;i<=n;i++){
int u,w;scanf("%d%d",&u,&w);
addedge(u,i,w);
}
dfs1();dfs2();
for(int i=;i<=n;i++){
printf("%d\n",max(dp[i][],dp[i][])); //以i为根的最长路;向父亲方向走的最长路
}
}
}
2019-02-03
HDU 2196 Computer (树上最长路)【树形DP】的更多相关文章
- 中南大学oj 1317 Find the max Link 边权可以为负的树上最长路 树形dp 不能两遍dfs
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1317经典问题:树上最长路,边权可以为负值的,树形dp,不能用两边dfs.反例:5 41 2 22 ...
- hdu 6501 transaction transaction transaction 最长路/树形DP/网络流
最长路: 设置一个虚拟起点和虚拟终点,每个点与起点间一条负边,值为这个点书的价值的相反数(代表买书花钱),每个点与终点连一条正边,值为这个点的书的价格(代表卖书赚钱). 然后按照图中给的边建无向边,权 ...
- HDU 2196 Computer( 树上节点的最远距离 )
Computer Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- HihoCoder1050 树中的最长路 树形DP第三题(找不到对象)
题意:求出的树中距离最远的两个结点之间相隔的距离. 水题一道,以前只会用路的直径来解. 代码如下: #include<cstdio> #include<cstdlib> #in ...
- HDU4612 Warm up —— 边双联通分量 + 重边 + 缩点 + 树上最长路
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4612 Warm up Time Limit: 10000/5000 MS (Java/Ot ...
- 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(求树上每个点的最长距离)
题意: 这题想了挺久的, 参考了kuangbin大神的代码:https://www.cnblogs.com/kuangbin/archive/2012/08/28/2659915.html 给出树上边 ...
- HDU 2196 Computer 树形DP 经典题
给出一棵树,边有权值,求出离每一个节点最远的点的距离 树形DP,经典题 本来这道题是无根树,可以随意选择root, 但是根据输入数据的方式,选择root=1明显可以方便很多. 我们先把边权转化为点权, ...
随机推荐
- Glide高级详解—缓存与解码复用
Glide 使用简明的流式语法API,大多数情况下,可能完成图片的设置你只需要:Glide.with(activity) .load(url) .into(imageView); 默认情况下,Glid ...
- 【转载】 Eclipse注释模板设置详解
Eclipse注释模板设置详解 网站推荐: 金丝燕网(主要内容是 Java 相关) 木秀林网(主要内容是消息队列)
- 细说Django的中间件
分析Django的生命周期,我们知道所有的http请求都要经过Django的中间件. 假如现在有一个需求,所有到达服务端的url请求都在系统中记录一条日志,该怎么做呢? Django的中间件的简介 D ...
- Confluence 6 查看索引和提示
查看索引 Confluence 使用被称为 Lucene 的搜索引擎.如果你希望在你的 Confluence站点中查看更多有关索引的细节,你可以下载并且运行 Luke.Luke 是一个开发和诊断工具, ...
- mongodb基类封装实例
mongodb的基类 1 <?php 2 3 namespace BI\Service\MongoDB; 4 5 use MongoDB\Driver\BulkWrite; 6 use Mong ...
- 1873: This offer(zzuli)
题目描述 话说WX入职已经有一个多月了,公司boss突然扔给他了一个问题,如果解决不了的话就会被开除掉 - -#,情急之下他只能来请教你了,boss给了他N个不大于100的数,现在wx需要将这N个数通 ...
- 《剑指offer》 二进制中1的个数
本题来自<剑指offer> 二进制中1的个数 题目: 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 思路: 两种思路: 第一种:对n进行左移,检测最后一位是否为1,但考 ...
- 第五周学习总结-HTML5
2018年8月12日 暑假第五周,我把HTML剩余的一些标签和用法看完了并学了一些HTML5的标签及用法. HTML5比HTML多了一些元素,也删去了一些元素. HTML5新增元素 图形元素 < ...
- VOC数据集生成代码使用说明
#split.py 文件 输入格式为images ,和标签txt文件,txt中的数据为坐标值共8个. import os import numpy as np import math import c ...
- Ajax爬虫必用到的字典转换器
1.使用情景 在我们Ajax爬虫时需要用到以下这样的数据的时候我们会一个一个地复制粘贴,这样会很麻烦 def dictionary_converter(key_value): '''主要用于爬虫时复制 ...