题目链接
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define INF 0x3f3f3f3f
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int maxN = 10007;
int N, cnt, head[maxN], root[maxN][20], deep[maxN];
ll dis[maxN];
struct Eddge
{
int nex, to;
ll val;
Eddge(int a=-1, int b=0, ll c=0):nex(a), to(b), val(c) {}
}edge[maxN<<1];
void addEddge(int u, int v, ll val)
{
edge[cnt] = Eddge(head[u], v, val);
head[u] = cnt++;
}
void dfs(int u, int fa, int depth)
{
root[u][0] = fa;
deep[u] = depth;
for(int i=head[u]; i!=-1; i=edge[i].nex)
{
int v = edge[i].to;
if(v == fa) continue;
dis[v] = dis[u] + edge[i].val;
dfs(v, u, depth + 1);
}
}
void pre_LCA(int st)
{
dfs(st, -1, 0);
for(int j=0; (1<<(j+1))<N; j++)
{
for(int i=1; i<=N; i++)
{
if(root[i][j] < 0) root[i][j+1] = -1;
else root[i][j+1] = root[root[i][j]][j];
}
}
}
int LCA(int x, int y)
{
if(deep[x] < deep[y]) swap(x, y);
int temp = deep[x] - deep[y];
for(int i=0; (1<<i)<=temp; i++)
{
if((temp>>i) & 1) x = root[x][i];
}
if(x == y) return x;
for(int i=log2(1.*N); i>=0; i--)
{
if(root[x][i] != root[y][i])
{
x = root[x][i];
y = root[y][i];
}
}
return root[x][0];
}
ll large_dis;
int its_pos;
int L, R; //最后得到的树的直径的两头的点
void dfs1(int u, int fa, ll juli)
{
if(juli > large_dis)
{
large_dis = juli;
its_pos = u;
}
for(int i=head[u]; i!=-1; i=edge[i].nex)
{
int v = edge[i].to;
if(v == fa) continue;
dfs1(v, u, juli + edge[i].val);
}
}
void dfs2(int u, int fa, ll juli)
{
if(juli > large_dis)
{
large_dis = juli;
R = u;
}
for(int i=head[u]; i!=-1; i=edge[i].nex)
{
int v = edge[i].to;
if(v == fa) continue;
dfs2(v, u, juli + edge[i].val);
}
}
void solve_RD_of_Tree()
{
large_dis = 0;
dfs1(1, 1, 0);
L = its_pos;
large_dis = 0;
dfs2(L, L, 0);
}
void init()
{
cnt = 0;
memset(dis, 0, sizeof(dis));
memset(head, -1, sizeof(head));
memset(root, -1, sizeof(root));
}
int main()
{
while(scanf("%d", &N)!=EOF)
{
init();
for(int i=2; i<=N; i++)
{
int e1;
ll e2;
scanf("%d%lld", &e1, &e2);
addEddge(e1, i, e2);
addEddge(i, e1, e2);
}
pre_LCA(1);
solve_RD_of_Tree();
for(int i=1; i<=N; i++)
{
int the_same = LCA(L, i);
ll dis1 = dis[L] + dis[i] - 2*dis[the_same];
the_same = LCA(R, i);
ll dis2 = dis[R] + dis[i] - 2*dis[the_same];
printf("%lld\n", max(dis1, dis2));
}
}
return 0;
}