Computer

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5925    Accepted Submission(s): 2979

Problem Description
A school bought the first computer some time ago(so this computer's id is 1). During the recent years the school bought N-1 new computers. Each new computer was connected to one of settled earlier. Managers of school are anxious about slow functioning of the net and want to know the maximum distance Si for which i-th computer needs to send signal (i.e. length of cable to the most distant computer). You need to provide this information.

Hint: the example input is corresponding to this graph. And from the graph, you can see that the computer 4 is farthest one from 1, so S1 = 3. Computer 4 and 5 are the farthest ones from 2, so S2 = 2. Computer 5 is the farthest one from 3, so S3 = 3. we also get S4 = 4, S5 = 4.

 
Input
Input file contains multiple test cases.In each case there is natural number N (N<=10000) in the first line, followed by (N-1) lines with descriptions of computers. i-th line contains two natural numbers - number of computer, to which i-th computer is connected and length of cable used for connection. Total length of cable does not exceed 10^9. Numbers in lines of input are separated by a space.
 
Output
For each case output N lines. i-th line must contain number Si for i-th computer (1<=i<=N).
 
Sample Input
5
1 1
2 1
3 1
1 1
 
Sample Output
3
2
3
4
4
 
Author
scnu
 
Recommend
lcy

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<vector>
#define N 10010
using namespace std;
struct node
{
int to,len;//下一个节点,长度
node (int x,int y)
{
to=x;
len=y;
}
};
int n;
/*
第一个dfs是先搜然后再转移状态的,用结点下方的数据更新
第二个dfs是先状态转移然后再搜的,这是从结点上方进行数据更新,刚好满足题意:结点左右两个“子树”
*/
vector<node> adj[N*];
int maxn[N];//第i个点的最大权值
int smaxn[N];//第i个点的第二大的权值
int maxi[N];//最大权值的点
int smaxi[N];//第二大权值的点
void dfs1(int u,int p)//p是u的父节点
{
maxn[u]=;
smaxn[u]=;
for(int i=;i<adj[u].size();i++)
{
int v=adj[u][i].to;
if(v==p) continue;//和父节点一样
dfs1(v,u);
if(maxn[v]+adj[u][i].len>smaxn[u])//先和第二长的距离比较,这样能记录下第二长的距离,这个数据能为下一个dfs提供判断
{
smaxn[u]=maxn[v]+adj[u][i].len;
smaxi[u]=v;
if(maxn[u]<smaxn[u])//更新之后第二长的路径,如果比原来最长的路径还长就替换,并且原来的最长的就变成第二长得了
{
swap(maxn[u],smaxn[u]);
swap(maxi[u],smaxi[u]);
}
}
}
} //从父节点更新过来的
void dfs2(int u,int p)
{
for(int i=;i<adj[u].size();i++)
{
int v=adj[u][i].to;
if(v==p) continue;//和父节点一样
if(v==maxi[u])
//这个地方如果下一个结点刚巧是就是dfs1中搜出来的最大值的节点的话
//那么这一条路就不能用最大值去算,因为这样就算上上一条路的了
{
if(adj[u][i].len+smaxn[u]>smaxn[v])
{
smaxn[v]=adj[u][i].len+smaxn[u];
smaxi[v]=u;
if(maxn[v]<smaxn[v])
{
swap(maxn[v],smaxn[v]);
swap(maxi[v],smaxi[v]);
}
}
}
else
{
if(adj[u][i].len+maxn[u]>smaxn[v])
{
smaxn[v]=adj[u][i].len+maxn[u];
smaxi[v]=u;
if(maxn[v]<smaxn[v])
{
swap(maxn[v],smaxn[v]);
swap(maxi[v],smaxi[v]);
}
}
}
dfs2(v,u);
}
}
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%d",&n)!=EOF)
{
for(int i=;i<=n;i++)
adj[i].clear();
for(int i=;i<=n;i++)
{
int a,b;
scanf("%d%d",&a,&b);
adj[i].push_back(node(a,b));
adj[a].push_back(node(i,b));
}
dfs1(,-);//从子节点更新
dfs2(,-);//从父节点更新
for(int i=;i<=n;i++)
printf("%d\n",maxn[i]);
}
return ;
}

hdu 2196 Computer(树形DP经典)的更多相关文章

  1. HDU 2196 Computer 树形DP经典题

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

  2. HDU 2196 Computer 树形DP 经典题

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

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

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

  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)

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

  7. HDU - 2196(树形DP)

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

  8. hdu 2196【树形dp】

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

  9. HDU 2196 Compute --树形dp

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

随机推荐

  1. AngularJS–Animations(动画)

    点击查看AngularJS系列目录 转载请注明出处:http://www.cnblogs.com/leosx/   在AngularJS 1.3 中,给一些指令(eg:   ngRepeat,ngSw ...

  2. vue-chat项目之重构与体验优化

    前言 vue-chat 也就是我的几个月之前写的一个基于vue的实时聊天项目,到目前为止已经快满400star了,注册量也已经超过了1700+,消息量达2000+,由于一直在实习,没有时间对它频繁地更 ...

  3. Java伪代码描述《大道至简》第一章

    第一节 Begin //原始需求 惩山北之塞,出入之迂 //项目沟通的基本方式 聚室而谋曰 //项目目标 毕力平险,指通豫南,达于汉阴 //技术方案 扣石垦壤,箕畚运于渤海之尾 //技术人员和工程管理 ...

  4. swoole 入门

    1. 概述 Swoole是PHP的一个扩展,但是它与普通的扩展不同,普通的扩展知识提供一个库函数,而Swoole扩展在运行后会接管PHP的控制器,进入时间循环.当IO时间发生后,Swoole会自动回调 ...

  5. HDU1223 Order Count 动态规划 组合数

    动态规划+组合数+大数 #include<cstdio> #include<cstdlib> #include<iostream> #include<algo ...

  6. java web Servlet 学习笔记 -3 会话管理技术

     Cookie和HttpSession 什么是会话: 用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 每个用户在使用浏览器与服务器进行会话的过 ...

  7. javascript bom 编程

     javascript bom  编程 BOM: 浏览器对象模型 DOM Window  :窗口Window Document 属性:     status :状态栏     self:自己    ...

  8. vue + ajax + php 接口的使用小接

    vue + ajax + php 接口的使用小接 前端代码: (获取用户信息,并渲染页面) userinfor.html <!DOCTYPE html> <html lang=&qu ...

  9. ZPL条码打印类

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...

  10. Bootstrap文本排版基础--Bootsrap

    1.排版前的基础 (1)移动设备优先 <meta name="viewport" content="width=device-width, initial-scal ...