传送门

题意

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

思路

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

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

我们能够很简单的求出每个点到以它为根的子树的最远点的距离,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. 459 Repeated Substring Pattern 重复的子字符串

    给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成.给定的字符串只含有小写英文字母,并且长度不超过10000.示例 1:输入: "abab"输出: True解释: 可由 ...

  2. jQuery幸运大转盘_jQuery+PHP抽奖程序

    http://www.thinkphp.cn/code/1153.html 网上转盘抽奖程序大多是flash完成的,而本文使用jQuery和PHP来实现转盘抽奖程序. 若是想看更多js特效.网站源码. ...

  3. Java8特性之Lambda、方法引用以及Stream流

    Java 8 中的 Streams API 详解:https://www.ibm.com/developerworks/cn/java/j-lo-java8streamapi/ Java笔记——Jav ...

  4. struts 2.5 There is no Action mapped for namespace [/] and action name [user_find] associated with context path [/struts2_crm].

    遇到了这个错误. There is no Action mapped for namespace [/] and action name [user_find] associated with con ...

  5. Unity笔记(4)自学第四、五天

    主要是移动脚本和2个技能的脚本编写. 首先是移动的脚本: using System.Collections; using System.Collections.Generic; using Unity ...

  6. SQL Server调试存储过程

      一.   调试SQL   Server   2000 1.   设置帐户. <1>   在windows服务中找到MSSQLSERVER,双击弹出对话框. <2>   选择 ...

  7. http升级https改造方案

    一.解决方案 1.httpClient请求https版蓝鲸接口 (1).原理 https与http最大的区别在于SSL加密传输协议的使用.在自己写的JAVA HttpClient程序,想手动验证证书, ...

  8. 用npm来部署快速一个httpweb服务器

    https://blog.csdn.net/u012182627/article/details/55060594 http-server的安装######注意事项 安装http-server的时候 ...

  9. 【原】常用shell命令

    #ss -ln  监听常用端口 #netstat -an |grep 80    80端口被占用情况 #linux 下使用 tc 模拟网络延迟和丢包

  10. js 右键菜单

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...