hdu-2196 树形dp 求一个树中所有节点能到达的最远距离f[i] (其实也不难嘛!)
#include <bits/stdc++.h>
using namespace std;
const int N=1e4+;
struct T {
int to;
int w;
};
vector < vector <T> > g (N);
int d[N][];// d[i][0] 正向最大距离 d[i][1] 正向次大距离 d[i][2] 反向最大距离
int p[N]; // 正向最大距离所经过的子节点
int n;
void dfs1(int root) {//求正向距离
p[root]=d[root][]=d[root][]=d[root][]=;
for (int i=;i<g[root].size();i++) {
int _next=g[root][i].to;
int cost=g[root][i].w;
dfs1(_next);
if (d[root][]<d[_next][]+cost) {
d[root][]=d[root][];
d[root][]=d[_next][]+cost;
p[root]=_next;
}
else if (d[root][]<d[_next][]+cost)
d[root][]=d[_next][]+cost;
}
return ;
}
void dfs2(int root) {//求逆向距离
for (int i=;i<g[root].size();i++) {
int _next=g[root][i].to;
int cost=g[root][i].w;
if (_next!=p[root]) d[_next][]=max (d[root][],d[root][])+cost;
else d[_next][]=max (d[root][],d[root][])+cost;
dfs2(_next);
}
return ;
}
int main ()
{
while (~scanf ("%d",&n)) {
for (int i=;i<=n;i++) g[i].clear();
for (int i=;i<=n;i++) {
int x,cost; scanf ("%d %d",&x,&cost);
T tmp={i,cost}; g[x].push_back(tmp);
}
int root=;
dfs1(root);
dfs2(root);
for (int i=;i<=n;i++)
printf ("%d\n",max (d[i][],d[i][]));
}
return ;
}
hdu-2196 树形dp 求一个树中所有节点能到达的最远距离f[i] (其实也不难嘛!)的更多相关文章
- HDU 2196树形DP(2个方向)
HDU 2196 [题目链接]HDU 2196 [题目类型]树形DP(2个方向) &题意: 题意是求树中每个点到所有叶子节点的距离的最大值是多少. &题解: 2次dfs,先把子树的最大 ...
- HDU 2196 树形DP Computer
题目链接: HDU 2196 Computer 分析: 先从任意一点开始, 求出它到其它点的最大距离, 然后以该点为中心更新它的邻点, 再用被更新的点去更新邻点......依此递推 ! 代码: ...
- hdu 2196 树形dp
思路:先求以1为根时,每个节点到子节点的最大长度.然后再次从1进入进行更新. #include<iostream> #include<cstring> #include< ...
- 树形DP求各点能走到的最远距离
hdu2196 Computer Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- HDU 4514 - 湫湫系列故事——设计风景线 - [并查集判无向图环][树形DP求树的直径]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4514 Time Limit: 6000/3000 MS (Java/Others) Memory Li ...
- hdu 4123 树形DP+RMQ
http://acm.hdu.edu.cn/showproblem.php? pid=4123 Problem Description Bob wants to hold a race to enco ...
- hdu 4607 (树形DP)
当时比赛的时候我们找出来只要求出树的最长的边的节点数ans,如果要访问点的个数n小于ans距离直接就是n-1 如果大于的话就是(n-ans)*2+ans-1,当时求树的直径难倒我们了,都不会树形dp ...
- 浅谈关于树形dp求树的直径问题
在一个有n个节点,n-1条无向边的无向图中,求图中最远两个节点的距离,那么将这个图看做一棵无根树,要求的即是树的直径. 求树的直径主要有两种方法:树形dp和两次bfs/dfs,因为我太菜了不会写后者这 ...
- hdu 4607 树形dp 树的直径
题目大意:给你n个点,n-1条边,将图连成一棵生成树,问你从任意点为起点,走k(k<=n)个点,至少需要走多少距离(每条边的距离是1): 思路:树形dp求树的直径r: a:若k<=r+1 ...
随机推荐
- window.open打开新窗口 参数
1,基本描述 oNewWindow = window.open( sURL , sName , sFeatures, bReplace) window.open在打开一个窗口(其url为sURL)后, ...
- laravel中的数据库迁移
1.创建数据库迁移文件:生成数据库迁移文件,前面跟着时间戳: php artisan make:migration create_posts_table 创建数据库迁移文件:可以重命名数据表名: -- ...
- jquery 元素选择器
id选择器 JQuery 能使用CSS选择器来操作网页中的标签元素.如果想要通过一个id号去查找另一个元素就可以使用下面格式的选择 $('#my_id') 其中my_id表示根据id选择器获取页面中的 ...
- UVA 11464 - Even Parity 状态压缩,分析 难度: 2
题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...
- Java中的 JDK下载和环境配置(方式一)
第一步:需要安装JDK. JDK下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151 ...
- 【转载】 unity 塔防游戏
原文地址: Part1的地址:http://www.cnblogs.com/lcxBlog/p/6075984.html Part2的地址:http://www.cnblogs.com/lcxBlog ...
- C++ Templates 关于程序库的概念和通用工具
using namespace std所谓的命名空间,就是一种将程序库名称封装起来的方法,它就像在程序库中竖立了一道围墙 标准程序库中有一部分,比如string classes,支持具体的错误处理,它 ...
- 数据库-->记录操作
一.概览 MySQL数据操作: DML 在MySQL管理软件中,可以通过SQL语句中的DML语言来实现数据的操作,包括 使用INSERT实现数据的插入 UPDATE实现数据的更新 使用DELETE实现 ...
- (C/C++学习笔记)附页: C/C++各数据类型的相关说明
- Cracking The Coding Interview 1.8
//Assume you have a method isSubstring which checks if one word is a substring of another. //Given t ...