HDU 2196 Computer(求树上每个点的最长距离)
题意:
这题想了挺久的, 参考了kuangbin大神的代码:https://www.cnblogs.com/kuangbin/archive/2012/08/28/2659915.html
给出树上边的长度, 求出每一个点的最长距离(就是求这个点到某一个叶子结点的距离, 这个距离最长)。
分析:
结点u的最长路径, 其实就是max( u到子树叶子的最长路径, u到父亲的距离 + 父亲子树的最长路径).
注意, 因为父亲子树的最长路径可能会经过u, 这样这个状态就不能用 u到父亲的距离 + 父亲子树的最长路径表示。
所以记录每个节点的最长路和次长路。
用两次dfs求解。
第一次dfs求出每个点只看子树的最长距离和次长距离。(只关注结点本身)
第二次dfs求出每个孩子结点的最长距离(答案)。(关注结点的孩子)
松弛条件可以看代码。
#include<stdio.h>
#include<vector>
#include<algorithm>
#include<string.h>
#include<iostream>
using namespace std; const int maxn = + ;
const int inf = 1e9 + ;
int Max[maxn];// 最大距离
int sMax[maxn];// 次大距离
int Id[maxn];// 最大距离对应序号
int sId[maxn];// 次大距离对应序号
struct Edge {
int v, d;
};
vector<Edge> G[maxn];
int N;
void init() {
for(int i = ; i < maxn; i ++) {
G[i].clear();
}
}
void dfs1(int u, int pre) {//更新u本身
Max[u] = sMax[u] = ;
for(int i = ; i < G[u].size(); i++) {
int v = G[u][i].v, d = G[u][i].d;
if(v == pre)
continue; //不经过父亲, 只搜索子树
dfs1(v, u); //一直搜到叶子再回溯, 因为是根据孩子的Max更新自己的Max
if(sMax[u] < Max[v] + d) { //如果u的次长距离 < 到v的距离 + v的最大距离
//更新距离
sMax[u] = Max[v] + d;
sId[u] = v;
if(sMax[u] > Max[u]) { //如果次长距离大于最长距离, 交换二者位置
swap(sMax[u], Max[u]);
swap(sId[u], Id[u]);
}
}
}
}
int dfs2(int u, int pre) {//更新u的孩子
for(int i = ; i < G[u].size(); i++) {
int v = G[u][i].v, d = G[u][i].d;
if(v == pre)
continue; //同样不经过父亲
if(v == Id[u]) { //如果v在u的最长路径上
if(sMax[u] + d > sMax[v]) { //看看u的次长路 + d 是否> v的次长路
sMax[v] = sMax[u] + d;
sId[v] = u;
if(sMax[v] > Max[v]) { //如果次长距离大于最长距离, 交换二者位置
swap(sMax[v], Max[v]);
swap(sId[v], Id[v]);
}
}
} else { // v不在u的最长路径上
if(d + Max[u] > sMax[v]) { //试着更新v
sMax[v] = d + Max[u];
sId[v] = u;
if(sMax[v] > Max[v]) { //如果次长距离大于最长距离, 交换二者位置
swap(sMax[v], Max[v]);
swap(sId[v], Id[v]);
}
}
}
dfs2(v, u);
}
}
int main() {
while(cin >> N) {
init();
for(int i = ; i <= N; i++) {
int u, v, d;
cin >> v >> d;
G[i].push_back((Edge){v,d});
G[v].push_back((Edge){i,d});
}
dfs1(, -); dfs2(, -); for(int i = ; i <= N; i++) {
cout << Max[i] << "\n";
}
}
return ;
}
HDU 2196 Computer(求树上每个点的最长距离)的更多相关文章
- hdu 2196(求树上每个节点到树上其他节点的最远距离)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2196 思路:首先任意一次dfs求出树上最长直径的一个端点End,然后以该端点为起点再次dfs求出另一个 ...
- HDU 2196 Computer (树dp)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2196 给你n个点,n-1条边,然后给你每条边的权值.输出每个点能对应其他点的最远距离是多少 ...
- 题解报告:hdu 2196 Computer(树形dp)
Problem Description A school bought the first computer some time ago(so this computer's id is 1). Du ...
- HDU 2196 Computer(求树上每一个节点到其他点的最远距离)
解题思路: 求出树的直径的两个端点.则树上每一个节点到其它点的最远距离一定是到这两个端点的距离中最长的那一个. #include <iostream> #include <cstri ...
- HDU 2196 Computer (树上最长路)【树形DP】
<题目链接> 题目大意: 输出树上每个点到其它点的最大距离. 解题分析: 下面的做法是将树看成有向图的做法,计算最长路需要考虑几种情况. dp[i][0] : 表示以i为根的子树中的结点与 ...
- HDU 2196 Computer( 树上节点的最远距离 )
Computer Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- HDU 2196.Computer 树形dp 树的直径
Computer Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- hdu 2196 Computer 树的直径
Computer Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem ...
- HDU 2196 Computer 树形DP经典题
链接:http://acm.hdu.edu.cn/showproblem.php? pid=2196 题意:每一个电脑都用线连接到了还有一台电脑,连接用的线有一定的长度,最后把全部电脑连成了一棵树,问 ...
随机推荐
- 仅用递归函数操作逆序一个栈(Swift 4)
/// 取出栈底的数 func getAndRemoveLastElement(_ items: inout [Int]) -> Int { let value = items.remove(a ...
- bzoj 4456 [Zjoi2016]旅行者
题面 https://www.lydsy.com/JudgeOnline/problem.php?id=4456 题解 分治 设当前work的区间为(x1,y1,x2,y2) 我们将长边分成两半 不妨 ...
- CentOS 7不重启刷新磁盘列表
[root@master-09:29:09 33~]#ls /sys/class/scsi_host/host0 host1 host2[root@master-09:29:55 34~]#echo ...
- angularjs <input>标签获取时间显示问题
一般的后台管理中,几乎每个管理后台都有设置新密码的功能,但是获取的时候为了好看,都有统一用一定的标签,比如input标签,ng-model来控制显示数据,但是在获取时间的时候用会显示错乱 代码为: & ...
- 用NPOI从Excel到DataTable
NPOI功能强大,不用装Excel,就可以操作表格中数据----Excel.Sheet------>DataTable private IWorkbook workbook = null; pr ...
- SecureCRT中vi或vim编辑器显示中文乱码问题
vi ~/.vimrc //新建文件 syntax on set showmode set autowrite set number set encoding=utf-8 fileencodings ...
- java.lang.NoSuchMethodError: org.hibernate.cfg.Environment.verifyProperties
我在使用jpa2+spring4+hibernate4 的时候,报错java.lang.NoSuchMethodError: org.hibernate.cfg.Environment.verifyP ...
- ios 苹果原生系统定位 CLLocationManager
首先要干这些事 下面的方法亲测可用 ------------------------------------------------------------ DNLogFUNC //初始化位置管理对象 ...
- cacti支持中文办法
1.yum groupinstall "chinese support" 2. 登陆Cacti,在主页的左边点击setting,选择paths页(console>>se ...
- sql语句分为三类(DML,DDL,DCL)-介绍
本文知识来源自:<Oracle专家高级编程> 分享作者:Vashon 时间:20150415 DDL is Data Definition Language statements. Som ...