hdoj2196(树形dp,树的直径)
题目链接: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,树的直径)的更多相关文章
- HDU 2196.Computer 树形dp 树的直径
Computer Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- hdu 4607 树形dp 树的直径
题目大意:给你n个点,n-1条边,将图连成一棵生成树,问你从任意点为起点,走k(k<=n)个点,至少需要走多少距离(每条边的距离是1): 思路:树形dp求树的直径r: a:若k<=r+1 ...
- computer(树形dp || 树的直径)
Computer Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- VIJOS1476旅游规划[树形DP 树的直径]
描述 W市的交通规划出现了重大问题,市政府下决心在全市的各大交通路口安排交通疏导员来疏导密集的车流.但由于人员不足,W市市长决定只在最需要安排人员的路口安放人员.具体说来,W市的交通网络十分简单,它包 ...
- POJ 3162.Walking Race 树形dp 树的直径
Walking Race Time Limit: 10000MS Memory Limit: 131072K Total Submissions: 4123 Accepted: 1029 Ca ...
- Computer(HDU2196+树形dp+树的直径)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2196 题目: 题意:有n台电脑,每台电脑连接其他电脑,第i行(包括第一行的n)连接u,长度为w,问你每 ...
- poj3162 树形dp|树的直径 + 双单调队列|线段树,好题啊
题解链接:https://blog.csdn.net/shiqi_614/article/details/8105149 用树形dp是超时的,, /* 先求出每个点可以跑的最长距离dp[i][0|1] ...
- hdu-2169 Computer(树形dp+树的直径)
题目链接: Computer Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- 树形DP+树状数组 HDU 5877 Weak Pair
//树形DP+树状数组 HDU 5877 Weak Pair // 思路:用树状数组每次加k/a[i],每个节点ans+=Sum(a[i]) 表示每次加大于等于a[i]的值 // 这道题要离散化 #i ...
- [HDU 5293]Tree chain problem(树形dp+树链剖分)
[HDU 5293]Tree chain problem(树形dp+树链剖分) 题面 在一棵树中,给出若干条链和链的权值,求选取不相交的链使得权值和最大. 分析 考虑树形dp,dp[x]表示以x为子树 ...
随机推荐
- http range request
range request: 要求实现该功能需要指定下载的实体范围
- 小米 oj 发奖励(思维)
发奖励 序号:#75难度:有挑战时间限制:1000ms内存限制:10M 描述 小明老师准备给一些得到小红花的小朋友发糖果做为奖励. 假设有n个小朋友,每个小朋友拥有的小红花为m(n)个,他让这n个小 ...
- Combine String HDU - 5707 dp or 广搜
Combine String HDU - 5707 题目大意:给你三个串a,b,c,问a和b是不是恰好能组成c,也就是a,b是不是c的两个互补的子序列. 根据题意就可以知道对于c的第一个就应该是a第一 ...
- Python字典元素的增加删除和取出字典所有的键和值
一.增加一个或多个元素 d = {'a': 1} d.update(b=2) #也可以 d.update({‘b’: 2}) print(d) # {'a': 1, 'b': 2} d['e'] = ...
- solr安装记录
[root@localhost bin]# ./solr start -force*** [WARN] *** Your open file limit is currently 1024. It ...
- Leetcode题目155.最小栈(简单)
题目描述: 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中.pop() -- 删除栈顶的元素.top() -- 获取栈顶 ...
- 压力测试 Jmeter的简单测试及常用查看结果参数介绍
(1)保存方案 (2)创建线程组 线程组用来模拟用户的并发访问 线程组主要包含三个参数:线程数.准备时长(Ramp-Up Period(in seconds)).循环次数. 线程数:虚拟用户数.一个虚 ...
- curl_setopt(ch, option, value)函数上传文件
bool curl_setopt ( resource $ch , int $option , mixed $value ) 为给定的cURL会话句柄设置一个选项 详细介绍请到:http://www. ...
- AB窗体互传参数本质
一.找了好几个,都不靠谱,不是说不靠谱,自己感觉太繁琐,根本就是本窗体的属性(对象)的传递,1实例化2把实例化后的窗体属性=本窗体的对象 二.传递的的时候都是在互相引用的时候传递,推荐的个人认为最简单 ...
- Android性能优化-电量优化
前言 电量优化,这个名词在传统PC时代,我们基本很少听见.然而到了诺基亚时代,我们也同样很少关注.直到了移动互联的智能机时代.电量优化才被慢慢的重视起来.可能的原因如下: 移动设备,不能一直使用电源供 ...