题意:
给出一棵树,求离每个节点最远的点的距离
很经典的树dp。。
参考http://www.cnblogs.com/WABoss/p/5267488.html
dp[2][v] = max( dp[0][u]+weight(u,v) , dp[2][u]+weight(u,v) ) (v是u的儿子 且 u往下走的最远距离不经过v)
dp[2][v] = max( dp[1][u]+weight(u,v) , dp[2][u]+weight(u,v) ) (v是u的儿子 且 u往下走的最远距离经过v)
int n;
int tot,vv[N<<1],cost[N<<1],nxt[N<<1],fst[N];
int dp[5][N];
void add(int u,int v,int c){
vv[tot]=v;cost[tot]=c;nxt[tot]=fst[u];fst[u]=tot++;
}
void dfs1(int u,int fa){
for(int i=fst[u];~i;i=nxt[i]){
int v=vv[i];
if(v==fa)continue;
dfs1(v,u);
int dis=dp[0][v]+cost[i];
if(dis>dp[0][u]){
dp[1][u]=dp[0][u];
dp[0][u]=dis;
}else if(dis>dp[1][u]){
dp[1][u]=dis;
}
}
}
void dfs2(int u,int fa){
for(int i=fst[u];~i;i=nxt[i]){
int v=vv[i];
if(v==fa)continue;
dp[2][v]=max(dp[2][u],dp[0][v]+cost[i]==dp[0][u]?dp[1][u]:dp[0][u])+cost[i];
dfs2(v,u);
}
}
int main(){
//freopen("in.txt","r",stdin);
while(~sf("%d",&n)){
mem(fst,-1);tot=0;mem(dp,0);
rep(i,1,n-1){
int u,c;sf("%d%d",&u,&c);
add(i+1,u,c);add(u,i+1,c);
}
dfs1(1,1);
dfs2(1,1);
dp[2][1]=dp[0][1];
for(int i=1;i<=n;++i){
pf("%d\n",max(dp[0][i],dp[2][i]));
}
}
}