传送门

题意

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

思路

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

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

我们能够很简单的求出每个点到以它为根的子树的最远点的距离,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. 使用HttpClient携带证书报错_Certificate for <IP> doesn't match any of the subject alternative names:[域名]

    使用HttpClient携带pfx证书通过Https协议发送SOUP报文调用WebService接口时报如下错误: Exception in thread "main" javax ...

  2. Resources.getSystem() 与 getResources()区别

    参考: http://stackoverflow.com/questions/8633539/resources-getsystem-vs-getresources 相同: 都是取得 Resource ...

  3. Coprime Conundrum 容斥原理

    https://www.hackerrank.com/contests/hourrank-13/challenges/arthur-and-coprimes 我们可以枚举每一个p在[2, sqrt(n ...

  4. poj1715Hexadecimal Numbers(数位dp)

    链接 好久没写这种逐位计数的了. 先统计出总的数 ,s-n+1,倒着计算的 ,感觉倒着比较符合计算方式,总数为15*A(15,i) (1=<i<=8) 也就是1-8长度所有的排列总数 然后 ...

  5. Android 实现对多个EditText的监听

    create_account=(EditText)findViewById(R.id.create_account); create_password=(EditText)findViewById(R ...

  6. 调试SQL Server的存储过程及用户定义函数

    分类: 数据库管理 2005-06-03 13:57 9837人阅读 评论(5) 收藏 举报 sql server存储vb.net服务器sql语言 1.在查询分析器中调试 查询分析器中调试的步骤如下: ...

  7. dll、lib(动态链接库、静态链接库)的区别

    1.dll:dynamic link library: lib:static link library. 2.windows系统中,许多app并不是仅由一个完整的exe构成,而是按功能分成了若干部分, ...

  8. python 内置2to3工具将python2代码转换为python3代码

    python2与python3代码不兼容,如果需要python2代码在python3环境下运行,需要将代码进行转换,本文介绍使用python3内置工具2to3.py对代码进行转换 一:2to3.py在 ...

  9. iView webapp / Mint UI / MUI [前端UI]

    前端UI iView webapp一套高质量的 微信小程序 UI 组件库 https://weapp.iviewui.com/?from=iview Mint UI 基于 Vue.js 的移动端组件库 ...

  10. 常见的HTTP相应状态码

    200:请求被正常处理204:请求被受理但没有资源可以返回206:客户端只是请求资源的一部分,服务器只对请求的部分资源执行GET方法,相应报文中通过Content-Range指定范围的资源.301:永 ...