#include<bits/stdc++.h>
using namespace std;
const int M=10010;
struct node{
int d,l,next;
}edge[2*M];
int m,a[M],maxn[M],smaxn[M],maxid[M],smaxid[M];
void addedge(int i,int j,int k){
edge[++m]=(node){j,k,a[i]};
a[i]=m;
}
void dfs1(int x,int pre){
maxn[x]=smaxn[x]=maxid[x]=smaxid[x]=0;
int i,y,k;
for(i=a[x];i!=-1;i=edge[i].next){
y=edge[i].d;
if(y==pre)continue;
dfs1(y,x);
k=edge[i].l;
if(k+maxn[y]>smaxn[x]){
smaxn[x]=k+maxn[y];
smaxid[x]=y;
if(smaxn[x]>maxn[x]){
swap(maxn[x],smaxn[x]);
swap(maxid[x],smaxid[x]);
}
}
}
}
void dfs2(int x,int pre){
int i,y,k;
for(i=a[x];i!=-1;i=edge[i].next){
y=edge[i].d;
if(y==pre)continue;
k=edge[i].l;
if(y!=maxid[x]&&k+maxn[x]>smaxn[y]){
smaxn[y]=k+maxn[x];
smaxid[y]=x;
if(smaxn[y]>maxn[y]){
swap(maxn[y],smaxn[y]);
swap(maxid[y],smaxid[y]);
}
}
if(y!=smaxid[x]&&k+smaxn[x]>smaxn[y]){
smaxn[y]=k+smaxn[x];
smaxid[y]=x;
if(smaxn[y]>maxn[y]){
swap(maxn[y],smaxn[y]);
swap(maxid[y],smaxid[y]);
}
}
dfs2(y,x);
}
}
int main(){
int n,i,j,k;
while(~scanf("%d",&n)){
m=0;
memset(a,-1,sizeof(a));
for(i=2;i<=n;i++){
scanf("%d%d",&j,&k);
addedge(i,j,k);
addedge(j,i,k);
}
dfs1(1,-1);
dfs2(1,-1);
for(i=1;i<=n;i++)
printf("%d\n",maxn[i]);
}
return 0;
}
HDU 2196 Computer
最新推荐文章于 2020-03-13 18:14:45 发布