题意:

给出电脑网络连接树,求每个节点的为起点的最长距离

分析:

这道题开始状态想不出来,放了一段时间,后来注意到例题上有这道题,每个节点的最长距离可由父节点的最长距离,次长距离,和子节点的最长距离(三者取最大)决定。先用一个dfs求出各节点由各子树确定的最长距离,次长距离,再用一个dfs由父节点推各子节点的最长距离。

#include <map>
#include <set>
#include <list>
#include <cmath>
#include <queue>
#include <stack>
#include <cstdio>
#include <vector>
#include <string>
#include <cctype>
#include <complex>
#include <cassert>
#include <utility>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
typedef pair<int,int> PII;
typedef long long ll;
#define lson l,m,rt<<1
#define pi acos(-1.0)
#define rson m+1,r,rt<<11
#define All 1,N,1
#define read freopen("in.txt", "r", stdin)
#define N 10010
const ll INFll = 0x3f3f3f3f3f3f3f3fLL;
const int INF= 0x7ffffff;
const int mod = 1000000007;
struct edge{
int t,d;
};
//p[i]由父节点来的最长距离
//dp[i]由子树来的最长距离
//g[i]由子树来的次长距离
int dp[N],p[N],g[N],n,longest[N];
vector<edge>e[N];
int dfs(int root){
if(e[root].size()==0)
return 0;
if(dp[root])return dp[root];//记忆化搜索
int tmp;
for(int i=0;i<e[root].size();++i){
int son=e[root][i].t;
int cost=e[root][i].d;
if(dfs(son)+cost>dp[root]){
g[root]=dp[root];
dp[root]=dp[son]+cost;
tmp=son;
}
else if(dp[son]+cost>g[root])g[root]=dp[son]+cost;
}
longest[root]=tmp;//把取最长距离的子节点存起来,方便后面由次长距离的更新最长
return dp[root];
}
void dfs1(int root){
for(int i=0;i<e[root].size();++i){
int son=e[root][i].t;
int cost=e[root][i].d;
if(son==longest[root])//若在该子节点取得最长距离 ,由父节点的来自父节点的最长距离和来自子树的次长距离更新
p[son]=max(p[root],g[root])+cost;
else
p[son]=max(p[root],dp[root])+cost;//否则,由父节点的来自父节点的最长距离和来自子树的最长距离更新
dfs1(son);
}
}
int main()
{
while(~scanf("%d",&n)){
edge b;
int a;
memset(dp,0,sizeof(dp));
memset(p,0,sizeof(p));
memset(g,0,sizeof(g));
for(int i=1;i<=n;++i){
e[i].clear();
}
for(int i=2;i<=n;++i){
scanf("%d%d",&a,&b.d);
b.t=i;
e[a].push_back(b);
}
dfs(1);
dfs1(1);
for(int i=1;i<=n;++i){
printf("%d\n",max(p[i],dp[i]));
}
}
return 0;
}

  

HDU 2196-Computer(树形dp)的更多相关文章

  1. HDU 2196.Computer 树形dp 树的直径

    Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  2. HDU 2196 Computer 树形DP经典题

    链接:http://acm.hdu.edu.cn/showproblem.php? pid=2196 题意:每一个电脑都用线连接到了还有一台电脑,连接用的线有一定的长度,最后把全部电脑连成了一棵树,问 ...

  3. HDU 2196 Computer 树形DP 经典题

    给出一棵树,边有权值,求出离每一个节点最远的点的距离 树形DP,经典题 本来这道题是无根树,可以随意选择root, 但是根据输入数据的方式,选择root=1明显可以方便很多. 我们先把边权转化为点权, ...

  4. hdu 2196 Computer(树形DP)

    Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  5. hdu 2196 Computer 树形dp模板题

    Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  6. hdu 2196 Computer(树形DP经典)

    Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  7. HDU 2196 Computer (树dp)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2196 给你n个点,n-1条边,然后给你每条边的权值.输出每个点能对应其他点的最远距离是多少 ...

  8. HDU - 2196(树形DP)

    题目: A school bought the first computer some time ago(so this computer's id is 1). During the recent ...

  9. hdu 2196【树形dp】

    http://acm.hdu.edu.cn/showproblem.php?pid=2196 题意:找出树中每个节点到其它点的最远距离. 题解: 首先这是一棵树,对于节点v来说,它到达其它点的最远距离 ...

  10. HDU 2196 Compute --树形dp

    Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

随机推荐

  1. 判断js中的数据类型

    如何判断js中的数据类型:typeof.instanceof. constructor. prototype方法比较 如何判断js中的类型呢,先举几个例子: var a = "iamstri ...

  2. drupal CMS

    http://drupalchina.cn/ https://www.drupal.org

  3. 原生JS的对象常用操作总结

       前端时间写了篇怎么判断js对象相等的文章,一直在期待大神给点消息,无奈一直杳无音讯,还是自己写个函数来进行判断,下面总结一些常用的对象操作的方法.    咋们来个先抑后扬的方式,先放出几个基本的 ...

  4. poj 2449 Remmarguts' Date(第K短路问题 Dijkstra+A*)

    http://poj.org/problem?id=2449 Remmarguts' Date Time Limit: 4000MS   Memory Limit: 65536K Total Subm ...

  5. 实时数据处理环境搭建flume+kafka+storm:0.环境依赖

    storm需要java和Python  部署依赖环境 --- 要求Java 6+ .Python 2.6.6+   java,python安装配置完成       

  6. [转]struct实例字段的内存布局(Layout)和大小(Size)

    在C/C++中,struct类型中的成员的一旦声明,则实例中成员在内存中的布局(Layout)顺序就定下来了,即与成员声明的顺序相同,并且在默认情况下总是按照结构中占用空间最大的成员进行对齐(Alig ...

  7. DIV中TABLE居的2种方式

    <html><head><title>测试页面</title></head><body><div width=" ...

  8. uva 437 hdu 1069

    dp  将石块按三个面存入队列  按底面积排序  dp就最大高度  按嵌套矩形最长路做做法 #include <iostream> #include <cstdio> #inc ...

  9. Making your local server accessible from anywhere

    In reality you probably don’t want to host you websites on your local computer unless you have a ver ...

  10. HTTPS访问:weblogic下配置SSL

    进入Weblogic安装路径下的JDK安装目录bin文件下,通过keytool工具生成密钥对(标识密钥库) 输入命令,生成密钥 keytool.exe -genkey -v -alias weblog ...