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.
5 1 1 2 1 3 1 1 1
3 2 3 4 4
//
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=22000;
//求树上每个节点到其他节点的最远距离.
struct Node
{
int t,w;
int tmax;//父节点到该子树的最远距离
int next;
};
int n;//节点个数
int p[maxn];
int l;
Node G[maxn];
int dp[maxn];//节点i到其他节点的最远距离
int f[maxn];//以1为根 节点i子树以外的节点到i的最远距离
void init()
{
memset(p,-1,sizeof(p));
l=0;
}
void addedge(int u,int t,int w)
{
G[l].t=t;
G[l].w=w;
G[l].next=p[u];
p[u]=l++;
}
//求以1为根到其子树的最远距离
void dfs1(int u,int fath)
{
for(int i=p[u];i!=-1;i=G[i].next)
{
int t=G[i].t,w=G[i].w;
if(t==fath) continue;
dfs1(t,u);
dp[u]=max(dp[u],dp[t]+w);
G[i].tmax=dp[t]+w;//u到t子树的最远距离
}
}
以1为根 节点i子树以外的节点到i的最远距离
void dfs2(int u,int fath,int k)
{
int res=0;
//fath到其他分支的最远距离
for(int i=p[fath];i!=-1;i=G[i].next)
{
if(G[i].t!=u) res=max(res,G[i].tmax);
}
//fath其他分支到u的最远距离,fath子树以外节点到u的最远距离
f[u]=max(res+G[k].w,f[fath]+G[k].w);
dp[u]=max(dp[u],f[u]);
for(int i=p[u];i!=-1;i=G[i].next)
{
int t=G[i].t;
if(t==fath) continue;
dfs2(t,u,i);
}
}
int main()
{
while(scanf("%d",&n)==1)
{
init();
for(int i=2;i<=n;i++)
{
int u=i,t,w;scanf("%d%d",&t,&w);
addedge(u,t,w);
addedge(t,u,w);
}
memset(dp,0,sizeof(dp));
dfs1(1,-1);//以1为根
f[1]=0;
for(int i=p[1];i!=-1;i=G[i].next)
{
int t=G[i].t;
dfs2(t,1,i);
}
for(int i=1;i<=n;i++) printf("%d\n",dp[i]);
}
return 0;
}