Connect to the tree-like DP at the beginning ,~~
Tree-like Dp not only connects to DP, but also trains DFS... creates the number of adjacent tables ~~
For more information, see ~~~
Http://www.cnblogs.com/kuangbin/archive/2012/08/28/2659915.html
#include <iostream>#include <cstring>#include <cstdio>#define MAXM 20000#define MAXN 20000#define INF 0x3f3f3f3f#define BUG printf("here!\n")using namespace std;struct node{ int u,v,len;};node edge[MAXM];int first[MAXN],next[MAXM];int maxx[MAXN],smaxx[MAXN];int maxxid[MAXN],smaxxid[MAXN];int dp[MAXN],cc;inline void add_edge(int u,int v,int w){ edge[cc].u=u; edge[cc].v=v; edge[cc].len=w; next[cc]=first[u]; first[u]=cc; cc++; edge[cc].u=v; edge[cc].v=u; edge[cc].len=w; next[cc]=first[v]; first[v]=cc; cc++;}void dfs1(int u,int p){ maxx[u]=0; smaxx[u]=0; int i; for(i=first[u];i!=-1;i=next[i]) { int v=edge[i].v; if(edge[i].v==p) continue; dfs1(edge[i].v,edge[i].u); if(smaxx[u]<maxx[v]+edge[i].len) { smaxx[u]=maxx[v]+edge[i].len; smaxxid[u]=v; if(smaxx[u]>maxx[u]) { int t=maxx[u]; maxx[u]=smaxx[u]; smaxx[u]=t; t=maxxid[u]; maxxid[u]=smaxxid[u]; smaxxid[u]=t; } } }}void dfs2(int u,int p){ int i,v; for(i=first[u];i!=-1;i=next[i]) { v=edge[i].v; if(v==p) continue; if(maxxid[u]==v) { if(smaxx[v]<smaxx[u]+edge[i].len) { smaxx[v]=smaxx[u]+edge[i].len; smaxxid[v]=u; if(smaxx[v]>maxx[v]) { int t=maxx[v]; maxx[v]=smaxx[v]; smaxx[v]=t; t=maxxid[v]; maxxid[v]=smaxxid[v]; smaxxid[v]=t; } } } else { if(smaxx[v]<maxx[u]+edge[i].len) { smaxx[v]=maxx[u]+edge[i].len; smaxxid[v]=u; if(smaxx[v]>maxx[v]) { int t=maxx[v]; maxx[v]=smaxx[v]; smaxx[v]=t; t=maxxid[v]; maxxid[v]=smaxxid[v]; smaxxid[v]=t; } } } dfs2(v,u); }}int main(){ int n; while(scanf("%d",&n)!=EOF) { int i; memset(first,-1,sizeof(first)); memset(next,-1,sizeof(next)); cc=0; memset(maxx,0,sizeof(maxx)); memset(smaxx,0,sizeof(smaxx)); memset(maxxid,0,sizeof(maxxid)); memset(smaxxid,0,sizeof(smaxxid)); for(i=2;i<=n;i++) { int u,l; scanf("%d%d",&u,&l); add_edge(i,u,l); } dfs1(1,-1); dfs2(1,-1); for(i=1;i<=n;i++) printf("%d\n",maxx[i]); } return 0;}