//之前存在的疑惑就是如何在dp的时取最大边时候路径不重复,,今天突然意识到,我们对每个树边建立一对反向边就可以通过异或控制方向了 //对树边进行dp,而不是结点也是自己第一次遇到哟. /* ID:1192432 PROG: castle LANG: C++ */ #include <iostream> #include <queue> #include <stack> #include <string> #include <map> #include <vector> #include <memory.h> #include <cstdio> #include <cmath> #include <algorithm> using namespace std; const int MAX=20005,INF=1<<30; const int root=1; bool vis[MAX]; int n,l; int first[MAX],u[MAX],v[MAX],w[MAX],next[MAX]; int f[MAX]; int dp(int num){ if(vis[num]) return f[num]; int vertex=v[num]; for(int e=first[vertex];e!=-1;e=next[e]){ if((e^1)!=num){ f[num]=max(f[num],dp(e)); } } f[num]+=w[num]; vis[num]=1; return f[num]; } int main() { #ifndef ONLINE_JUDGE freopen("i.txt", "r", stdin); #endif int maxVal; while(cin>>n){ l=0; memset(f,0,sizeof(f)); memset(vis,0,sizeof(vis)); memset(first,-1,sizeof(first)); for(int i=2;i<=n;i++){ cin>>u[l]>>w[l]; v[l]=i; next[l]=first[u[l]]; first[u[l]]=l; ++l; u[l]=v[l-1]; v[l]=u[l-1]; w[l]=w[l-1]; next[l]=first[u[l]]; first[u[l]]=l; ++l; } for(int i=0;i<l;i++){ if(!vis[i]){ dp(i); } } for(int i=1;i<=n;i++){ maxVal=-INF; for(int e=first[i];e!=-1;e=next[e]){ maxVal=max(maxVal,f[e]); } cout<<maxVal<<endl; } } return 0; }