解析:
這道題相當於樹的最長路徑加強版.
f[i]:表示以i爲根的子樹,到達節點i的最大值是多少
初始化 f[i]=c[i];
狀態轉移方程:
f[u]=max(f[u],f[v]+w[i])
解釋:當前u節點的最大值,有可能就是自身,有可能是子節點+邊權。所以兩者取較大者即可
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int e[N<<2],ne[N<<2],w[N<<2],h[N<<2],idx;
int t,n,ans;
int f[N];
void add(int a,int b,int c)
{
e[idx]=b;w[idx]=c;ne[idx]=h[a];h[a]=idx++;
}
void dfs(int u,int fa)
{
for(int i=h[u];~i;i=ne[i])
{
int v=e[i];
if(v==fa) continue;
dfs(v,u);
ans=max(ans,f[u]+f[v]+w[i]);
// cout<<ans<<endl;
f[u]=max(f[u],f[v]+w[i]);
}
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
idx=0;
memset(h,-1,sizeof h);
ans=-0x3f3f3f3f;
for(int i=2,u,c;i<=n;i++)
{
scanf("%d %d",&u,&c);
add(u,i,c);
add(i,u,c);
}
for(int i=1;i<=n;i++) scanf("%d",&f[i]);
dfs(1,-1);
cout<<ans<<endl;
}
return 0;
}