hdu2196
基本的树形dp,需要dfs三次,第一次求每个点最远的后代,第二次和第三次每个点的孩子分别从左到右和从右到左遍历。
#include <cstdio>
#include <vector>
using namespace std; #define D(x) const int MAX_N = (int)(1e4) + ; int n;
vector <pair<int, int> > edge[MAX_N];
int child[MAX_N];
int father_left[MAX_N];
int father_right[MAX_N]; void dfs_child(int father, int u)
{
child[u] = ;
for (int i = ; i < (int)edge[u].size(); i++)
{
int v = edge[u][i].first;
int w = edge[u][i].second;
if (v != father)
{
dfs_child(u, v);
child[u] = max(child[u], child[v] + w);
}
}
} void dfs_father_left(int father, int u, int up)
{
father_left[u] = up;
int temp = ;
for (int i = ; i < (int)edge[u].size(); i++)
{
int v = edge[u][i].first;
int w = edge[u][i].second;
if (v != father)
{
dfs_father_left(u, v, max(up, temp) + w);
temp = max(temp, w + child[v]);
}
}
} void dfs_father_right(int father, int u, int up)
{
father_right[u] = up;
int temp = ;
for (int i = (int)edge[u].size() - ; i >= ; i--)
{
int v = edge[u][i].first;
int w = edge[u][i].second;
if (v != father)
{
dfs_father_right(u, v, max(up, temp) + w);
temp = max(temp, w + child[v]);
}
}
} int main()
{
while (scanf("%d", &n) != EOF)
{
for (int i = ; i <= n; i++)
{
edge[i].clear();
}
for (int i = ; i <= n; i++)
{
int a, b;
scanf("%d%d", &a, &b);
edge[i].push_back(make_pair(a, b));
edge[a].push_back(make_pair(i, b));
}
dfs_child(-, );
dfs_father_left(-, , );
dfs_father_right(-, , );
for (int i = ; i <= n; i++)
{
D(printf("%d %d %d\n", child[i], father_left[i], father_right[i]));
printf("%d\n", max(child[i], max(father_left[i], father_right[i])));
}
}
return ;
}
hdu2196的更多相关文章
- 【hdu2196】Computer
hdu 2196 computer 题意 给你一棵树,边有权值. 对于每一个点,求其与其距离最远的点的距离. 分析 思路1:树的直径 利用直径的性质进行求解,网上资料很多,这里不赘述. #includ ...
- 【树形dp小练】HDU1520 HDU2196 HDU1561 HDU3534
[树形dp]就是在树上做的一些dp之类的递推,由于一般须要递归处理.因此平庸情况的处理可能须要理清思路.昨晚開始切了4题,作为入门训练.题目都很easy.可是似乎做起来都还口以- hdu1520 An ...
- hdu2196 树形dp
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2196 Problem Description A school bought the fi ...
- 【HDU2196 Computer】经典树形dp
http://acm.hdu.edu.cn/showproblem.php?pid=2196 题意:有n台电脑相连,让你求每台电脑与离它最远的那台电脑的距离. 思路:两遍搜索即可,第一遍从上到下,第二 ...
- HDU2196 Computer(树形DP)
和LightOJ1257一样,之前我用了树分治写了.其实原来这题是道经典的树形DP,感觉这个DP不简单.. dp[0][u]表示以u为根的子树中的结点与u的最远距离 dp[1][u]表示以u为根的子树 ...
- hdu2196 树的直径 + bfs
//Accepted 740 KB 15 ms //树的直径 //距离一个顶点最远的点一定是树的直径的一个端点 #include <cstdio> #include <cstring ...
- HDU-2196 Computer (树形DP)
题目大意:在一棵带边权的有根树中,对于每个点,找出它与离它最远的那个点的之间的距离. 题目分析:对于一个点,离它最远的点只有两种情况,一是它到叶子节点的最远距离,一是与它父亲的距离加上他的父亲到叶子节 ...
- HDU2196 - Computer(树形DP)
题目大意 给定一颗n个结点的树,编号为1~n,要求你求出每个结点能到达的最长路径 题解 用动态规划解决的~~~~把1 当成树根,这样就转换成有根树了.我们可以发现,对于每个结点的最长路,要么是从子树得 ...
- hdu2196 树形dp经典|树的直径
/* 两种做法 1.求出树直径v1,v2,那么有一个性质:任取一点u,树上到u距离最远的点必定是v1或v2 那么可以一次dfs求树v1 第二次求dis1[],求出所有点到v1的距离,同时求出v2 第三 ...
随机推荐
- linux下svn的命令
原文地址:http://www.cnblogs.com/wanqieddy/archive/2011/06/09/2076783.html
- tmux常用命令
tmux命令可以启动一个tmux服务,tmux服务包含多个session,session包含多个window,window包含多个pane. 常用命令tmux ls #显示已有tmux列表(C-b s ...
- line-height:150%和 line-height:1.5 的区别
父元素line-height为150%或1.5em时,依据父元素的字体大小计算出行高值让子元素继承父元素line-height为1.5时,依据子元素字体大小计算其行高值.
- YII2项目常用技能知识总结
1.不通过日志获取AR执行的原生SQL语句和打印变量数据 $query = User::find() ->select(['username'])->where(['id'=>[1, ...
- UnicodeDecodeError: 'utf8' codec can't decode
数据库存了些中文字符, 比如'处理脚本'这样的汉字, 结果导致一个python程序报错. 下面记录处理过程和相关结论. ===========================dal.py 程序片段,p ...
- C++ Singleton模式
地址:http://www.cppblog.com/dyj057/archive/2005/09/20/346.html Singleton模式是常用的设计模式之一,但是要实现一个真正实用的设计模式却 ...
- 2015多校1006.First One
First One Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total ...
- C#之规格说明书
1. Statement My Note Problem Statement Version 1.0 Revision History Date Issue Description Author ...
- 第六天 做的app不会改变什么
app包括资源和功能,做完之后没有改变什么
- PHPCMS V9多站点[站群功能]动态设置与静态设置子站内容URL
今天我们来讲解下 PHPCMS V9的站群功能的 动态站点与静态站点的配置 站群站点,分为动态站点,和静态站点两种设置方法: 静态的,就是将栏目和内容都了HTML 文件,我们先讲解下,站群的操作: 建 ...