题意
求树上的最大距离, 开三个dp数组维护三个状态 对比得到长的值
#include <bits/stdc++.h>
using namespace std;
#define CLR(a,b) memset(a,(b),sizeof(a))
#define ll long long
#define ls o<<1
#define rs o<<1|1
#define pb push_back
typedef unsigned long long ull;
const int MAXN = (int)1e5+10;
int dp[MAXN][3];
struct node {
int v, w;
node(int _v=0, int _w=0):v(_v),w(_w){}
};
vector<node> E[MAXN*2];
int n;
void dfs1(int u, int fa) {
for(int i = 0; i < E[u].size(); ++i) {
int v = E[u][i].v;
if(v == fa) continue;
dfs1(v, u);
int w = E[u][i].w;
int tmp = dp[v][0]+w;
if(tmp >= dp[u][0]) {
dp[u][1] = dp[u][0];
dp[u][0] = tmp;
}
else if(tmp > dp[u][1]) {
dp[u][1] = tmp;
}
}
}
void dfs2(int u, int fa) {
for(int i = 0; i < E[u].size(); ++i) {
int v = E[u][i].v;
int w = E[u][i].w;
if(v == fa) continue;
if(dp[u][0] == dp[v][0]+w)
dp[v][2] = max(dp[u][2], dp[u][1])+w;
else
dp[v][2] = max(dp[u][2], dp[u][0])+w;
dfs2(v, u);
}
}
int main() {
while(~scanf("%d",&n)) {
CLR(dp, 0);
for(int i = 1; i <= n; ++i) E[i].clear();
int v, w;
for(int i = 2; i <= n; ++i) {
scanf("%d%d",&v,&w);
E[i].pb(node(v, w));
E[v].pb(node(i, w));
}
dfs1(1, -1);
dfs2(1, -1);
for(int i = 1; i <= n; ++i) {
printf("%d\n", max(dp[i][0], dp[i][2]));
}
}
return 0;
}