传送门

题意

给出一棵树,求离每个节点最远的点的距离

思路

对于我这种菜鸡,真是难啊。

每个点的距离它最远的点,除了在它子树中的,还有在它子树之外的,所以这几个状态都得表示出来。

我们能够很简单的求出每个点到以它为根的子树的最远点的距离,dfs 即可。

设 f[i][0] 表示点 i 到以它为根的子树的最远点的距离

  f[i][1] 表示点 i 到以它为根的子树(并且这个子树与最远点所在子树不相同)的次远点的距离(一会会用到)

  f[i][2] 表示 除去点 i 的子树后,点 i 到离它最远的点的距离

  val 表示边权

那么 f[v][2] 怎么求?(u 表示 v 的父亲)

  if(f[v][0] + val[i] == f[u][0]) f[v][2] = f[u][1] + val[i];

  else f[v][2] = f[u][0] + val[i];

  f[v][2] = std::max(f[v][2], f[u][2] + val[i]);

那么一个点 i 到它的最远点的距离即为——max( f[i][0], f[i][2])

代码

 #include <cstdio>
#include <cstring>
#include <iostream>
#define M(a, x) memset(a, x, sizeof(a)); const int MAXN = ;
int n, cnt;
int head[MAXN], to[MAXN << ], val[MAXN << ], next[MAXN << ], f[MAXN][];
bool vis[MAXN]; inline void add(int x, int y, int z)
{
to[cnt] = y;
val[cnt] = z;
next[cnt] = head[x];
head[x] = cnt++;
} inline void dfs1(int u)
{
int i, v, dis1 = , dis2 = ;
vis[u] = ;
for(i = head[u]; i != -; i = next[i])
{
v = to[i];
if(!vis[v])
{
dfs1(v);
if(f[v][] + val[i] > dis1) dis2 = dis1, dis1 = f[v][] + val[i];
else if(f[v][] + val[i] > dis2) dis2 = f[v][] + val[i];
}
}
f[u][] = dis1;
f[u][] = dis2;
} inline void dfs2(int u)
{
int i, v;
vis[u] = ;
for(i = head[u]; i != -; i = next[i])
{
v = to[i];
if(!vis[v])
{
if(f[v][] + val[i] == f[u][]) f[v][] = f[u][] + val[i];
else f[v][] = f[u][] + val[i];
f[v][] = std::max(f[v][], f[u][] + val[i]);
dfs2(v);
}
}
} int main()
{
int i, x, y;
while(~scanf("%d", &n))
{
M(head, -);
M(f, );
cnt = ;
for(i = ; i <= n; i++)
{
scanf("%d %d", &x, &y);
add(i, x, y);
add(x, i, y);
}
M(vis, );
dfs1();
M(vis, );
dfs2();
for(i = ; i <= n; i++) printf("%d\n", std::max(f[i][], f[i][]));
}
return ;
}

2017.6.18

重新复习了一遍,感觉理解更透彻了。

其中发现原来理解错了,有的地方写的不对,已改正。

[HDU2196]Computer(DP)的更多相关文章

  1. LightOJ 1033 Generating Palindromes(dp)

    LightOJ 1033  Generating Palindromes(dp) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...

  2. lightOJ 1047 Neighbor House (DP)

    lightOJ 1047   Neighbor House (DP) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87730# ...

  3. UVA11125 - Arrange Some Marbles(dp)

    UVA11125 - Arrange Some Marbles(dp) option=com_onlinejudge&Itemid=8&category=24&page=sho ...

  4. 【POJ 3071】 Football(DP)

    [POJ 3071] Football(DP) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4350   Accepted ...

  5. 初探动态规划(DP)

    学习qzz的命名,来写一篇关于动态规划(dp)的入门博客. 动态规划应该算是一个入门oier的坑,动态规划的抽象即神奇之处,让很多萌新 萌比. 写这篇博客的目标,就是想要用一些容易理解的方式,讲解入门 ...

  6. Tour(dp)

    Tour(dp) 给定平面上n(n<=1000)个点的坐标(按照x递增的顺序),各点x坐标不同,且均为正整数.请设计一条路线,从最左边的点出发,走到最右边的点后再返回,要求除了最左点和最右点之外 ...

  7. 2017百度之星资格赛 1003:度度熊与邪恶大魔王(DP)

    .navbar-nav > li.active > a { background-image: none; background-color: #058; } .navbar-invers ...

  8. Leetcode之动态规划(DP)专题-详解983. 最低票价(Minimum Cost For Tickets)

    Leetcode之动态规划(DP)专题-983. 最低票价(Minimum Cost For Tickets) 在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行.在接下来的一年里,你要旅行的 ...

  9. 最长公共子序列长度(dp)

    /// 求两个字符串的最大公共子序列长度,最长公共子序列则并不要求连续,但要求前后顺序(dp) #include <bits/stdc++.h> using namespace std; ...

随机推荐

  1. git 标签

    如果你达到一个重要的阶段,并希望永远记住那个特别的提交快照,你可以使用 git tag 给它打上标签. 比如说,我们想为我们的 runoob 项目发布一个"1.0"版本. 我们可以 ...

  2. 灰度世界算法(Gray World Algorithm) 分类: 图像处理 Matlab 2014-12-07 18:40 874人阅读 评论(0) 收藏

    人的视觉系统具有颜色恒常性,能从变化的光照环境和成像条件下获取物体表面颜色的不变特性,但成像设备不具有这样的调节功能, 不同的光照环境会导致采集的图像颜色与真实颜色存在一定程度的偏差,需要选择合适的颜 ...

  3. d3学习笔记

    (1)使用enter()函数. 当要创建新的绑定数据的元素,必须使用enter().这个方法会分析当前选择的DOM元素和传给它的数据,如果数据值比对应的DOM元素多,就创建一个新的占位元素.然后把这个 ...

  4. SpringCloud开发学习总结(四)—— 客户端负载均衡Ribbon

    通过上一章<SpringCloud开发学习总结(三)—— 服务治理Eureka>,我们已经搭建起微服务架构中的核心组件——服务注册中心(包括单点模式和高可用模式).同时还注册了一个服务,命 ...

  5. python的des和3des加解密

    1.加密: pyDes.des(key, [mode], [IV], [pad], [padmode]) pyDes.triple_des(key, [mode], [IV], [pad], [pad ...

  6. CF792C Divide by Three

    思路: dp. 实现: #include <iostream> #include <cstdio> #include <cstring> #include < ...

  7. 关于Android软键盘把布局顶上去的问题(一)

    最近接触到了一个登陆页面,布局最上面显示的是一个波纹的view,中间显示账号和密码的EditText,紧接着还有一个Button: 希望:点击EditText时,软键盘不能把波纹的view顶出去,也不 ...

  8. Red Hat Linux常用命令

    1.查看机器型号 [root@local ~]# dmidecode | grep "Product Name" Product Name: VMware Virtual Plat ...

  9. python学习一 hello world of python

    我使用的环境是 OS:Red Hat Enterprise Linux AS release 4 (Nahant Update 3) PYTHON:2.7.2 如果操作系统没有安装python, 百度 ...

  10. K近邻法(K-Nearest Neighbor,KNN)

    KNN是一种基本分类与回归方法,本篇只总结分类问题中的KNN. 输入:样本的特征向量,对应于特征空间中的点 输出:样本的类别,可取多类 算法思想:给定一个样本类别已知的训练数据集,对于新样本,根据其K ...