[HDU2196]Computer(DP)
题意
给出一棵树,求离每个节点最远的点的距离
思路
对于我这种菜鸡,真是难啊。
每个点的距离它最远的点,除了在它子树中的,还有在它子树之外的,所以这几个状态都得表示出来。
我们能够很简单的求出每个点到以它为根的子树的最远点的距离,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)的更多相关文章
- LightOJ 1033 Generating Palindromes(dp)
LightOJ 1033 Generating Palindromes(dp) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...
- lightOJ 1047 Neighbor House (DP)
lightOJ 1047 Neighbor House (DP) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87730# ...
- UVA11125 - Arrange Some Marbles(dp)
UVA11125 - Arrange Some Marbles(dp) option=com_onlinejudge&Itemid=8&category=24&page=sho ...
- 【POJ 3071】 Football(DP)
[POJ 3071] Football(DP) Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4350 Accepted ...
- 初探动态规划(DP)
学习qzz的命名,来写一篇关于动态规划(dp)的入门博客. 动态规划应该算是一个入门oier的坑,动态规划的抽象即神奇之处,让很多萌新 萌比. 写这篇博客的目标,就是想要用一些容易理解的方式,讲解入门 ...
- Tour(dp)
Tour(dp) 给定平面上n(n<=1000)个点的坐标(按照x递增的顺序),各点x坐标不同,且均为正整数.请设计一条路线,从最左边的点出发,走到最右边的点后再返回,要求除了最左点和最右点之外 ...
- 2017百度之星资格赛 1003:度度熊与邪恶大魔王(DP)
.navbar-nav > li.active > a { background-image: none; background-color: #058; } .navbar-invers ...
- Leetcode之动态规划(DP)专题-详解983. 最低票价(Minimum Cost For Tickets)
Leetcode之动态规划(DP)专题-983. 最低票价(Minimum Cost For Tickets) 在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行.在接下来的一年里,你要旅行的 ...
- 最长公共子序列长度(dp)
/// 求两个字符串的最大公共子序列长度,最长公共子序列则并不要求连续,但要求前后顺序(dp) #include <bits/stdc++.h> using namespace std; ...
随机推荐
- 使用HttpClient携带证书报错_Certificate for <IP> doesn't match any of the subject alternative names:[域名]
使用HttpClient携带pfx证书通过Https协议发送SOUP报文调用WebService接口时报如下错误: Exception in thread "main" javax ...
- Resources.getSystem() 与 getResources()区别
参考: http://stackoverflow.com/questions/8633539/resources-getsystem-vs-getresources 相同: 都是取得 Resource ...
- Coprime Conundrum 容斥原理
https://www.hackerrank.com/contests/hourrank-13/challenges/arthur-and-coprimes 我们可以枚举每一个p在[2, sqrt(n ...
- poj1715Hexadecimal Numbers(数位dp)
链接 好久没写这种逐位计数的了. 先统计出总的数 ,s-n+1,倒着计算的 ,感觉倒着比较符合计算方式,总数为15*A(15,i) (1=<i<=8) 也就是1-8长度所有的排列总数 然后 ...
- Android 实现对多个EditText的监听
create_account=(EditText)findViewById(R.id.create_account); create_password=(EditText)findViewById(R ...
- 调试SQL Server的存储过程及用户定义函数
分类: 数据库管理 2005-06-03 13:57 9837人阅读 评论(5) 收藏 举报 sql server存储vb.net服务器sql语言 1.在查询分析器中调试 查询分析器中调试的步骤如下: ...
- dll、lib(动态链接库、静态链接库)的区别
1.dll:dynamic link library: lib:static link library. 2.windows系统中,许多app并不是仅由一个完整的exe构成,而是按功能分成了若干部分, ...
- python 内置2to3工具将python2代码转换为python3代码
python2与python3代码不兼容,如果需要python2代码在python3环境下运行,需要将代码进行转换,本文介绍使用python3内置工具2to3.py对代码进行转换 一:2to3.py在 ...
- iView webapp / Mint UI / MUI [前端UI]
前端UI iView webapp一套高质量的 微信小程序 UI 组件库 https://weapp.iviewui.com/?from=iview Mint UI 基于 Vue.js 的移动端组件库 ...
- 常见的HTTP相应状态码
200:请求被正常处理204:请求被受理但没有资源可以返回206:客户端只是请求资源的一部分,服务器只对请求的部分资源执行GET方法,相应报文中通过Content-Range指定范围的资源.301:永 ...