求树上每个点的 最远点的距离 Di
换根dp
#include <iostream> #include <vector> #include <algorithm> #include <cstring> using namespace std ; const int N=1e5,M=N; int nxt[M],go[M],hd[N],w[M],all; void add(int x,int y,int z){ go[++all]=y,nxt[all]=hd[x]; hd[x]=all; w[all]=z; } int n,d1[N],d2[N],f[N]; void dp1(int x){ int i; for(i=hd[x];i;i=nxt[i]){ int y=go[i]; dp1(y); if(d1[y]+w[i]>=d1[x]) d2[x]=d1[x],d1[x]=d1[y]+w[i]; else if(d1[y]+w[i]>d2[x]) d2[x]=d1[y]+w[i]; } } void dp2(int x){ int i; for(i=hd[x];i;i=nxt[i]){ int y=go[i]; if(d1[x]==d1[y]+w[i]) f[y]=max(f[x],d2[x])+w[i]; else f[y]=max(f[x],d1[x])+w[i]; dp2(y); } } int main(){ int x,y,i; while(cin>>n){ memset(hd,0,sizeof hd); memset(f,0,sizeof f); memset(d1,0,sizeof d1);memset(d2,0,sizeof d2); for(i=2;i<=n;i++) cin>>x>>y,add(x,i,y); dp1(1); dp2(1); for(i=1;i<=n;i++) cout<<max(f[i],d1[i])<<'\n'; } }