求树的所有结点的最长直径
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define M 10010
int len[M],len2[M],leaf[M],leaf2[M],head[M];
int n,tot;
struct node{
int to,dis,next;
}edge[M*2];
void insert(int u,int v,int dis){
edge[tot].to=v;
edge[tot].dis=dis;
edge[tot].next=head[u];
head[u]=tot++;
}
void dfs(int u,int pre){
int i,v;
for(i=head[u];i!=-1;i=edge[i].next){
v=edge[i].to;
if(v==pre) continue;
dfs(v,u);
if(len[v]+edge[i].dis>len[u]){
len2[u]=len[u];
leaf2[u]=leaf[u];
len[u]=len[v]+edge[i].dis;
leaf[u]=v;
}
else if(len[v]+edge[i].dis>len2[u]){
len2[u]=len[v]+edge[i].dis;
leaf2[u]=v;
}
}
}
void dfs2(int u,int pre){
int i,v;
for(i=head[u];i!=-1;i=edge[i].next){
v=edge[i].to;
if(v==pre) continue;
if(leaf[u]==v){
if(len2[u]+edge[i].dis>len[v]){
len2[v]=len[v];
leaf2[v]=leaf[v];
len[v]=len2[u]+edge[i].dis;
leaf[v]=u;
}
else if(len2[u]+edge[i].dis>len2[v]){
len2[v]=len2[u]+edge[i].dis;
leaf2[v]=u;
}
}
else{
if(len[u]+edge[i].dis>len[v]){
len2[v]=len[v];
leaf2[v]=leaf[v];
len[v]=len[u]+edge[i].dis;
leaf[v]=u;
}
else if(len[u]+edge[i].dis>len2[v]){
len2[v]=len[u]+edge[i].dis;
leaf2[v]=u;
}
}
dfs2(v,u);
}
}
int main(){
int v,dis;
while(scanf("%d",&n)!=EOF){
tot=0;
memset(head,-1,sizeof(head));
memset(len,0,sizeof(len));
memset(len2,0,sizeof(len2));
memset(leaf,-1,sizeof(leaf));
for(int i=2;i<=n;i++){
scanf("%d%d",&v,&dis);
insert(i,v,dis);
insert(v,i,dis);
}
dfs(1,-1);
dfs2(1,-1);
for(int i=1;i<=n;i++)
printf("%d\n",len[i]);
}
return 0;
}