链接 http://acm.hdu.edu.cn/showproblem.php?pid=2196
#include<iostream> #include<stdio.h> #include<cstring> #include<algorithm> using namespace std; struct date { long long len,Max,v,next; }edge[111234]; long long head[111234],total,dp[111234]; bool vis[111234]; inline long long max( long long a,long long b ){return a>b?a:b;} void add_edge( int u,int v,int len ) { edge[total].len = len; edge[total].Max = 0; edge[total].v = v; edge[total].next = head[u]; head[u] = total++; } void DFS1( int sta ) { vis[sta] = true; for( int i = head[sta]; i != -1; i = edge[i].next ) { int v = edge[i].v; if( vis[v] )continue; DFS1( v ); edge[i].Max = dp[v] + edge[i].len; dp[sta] = max( dp[sta],edge[i].Max ); } } void DFS2( int fa,int son ) { if( vis[son] )return ;vis[son] = true; int maxx = 0; for( int i = head[fa]; i != -1; i = edge[i].next ) if( edge[i].v != son ) maxx = max( maxx,edge[i].Max ); for( int i = head[son]; i != -1; i = edge[i].next ) if( edge[i].v == fa ){ edge[i].Max = maxx + edge[i].len; break;} for( int i = head[son]; i != -1; i = edge[i].next ) { dp[son] = max( dp[son],edge[i].Max ); DFS2( son,edge[i].v ); } } int main( ) { int N,u,len; while( scanf("%d",&N) != EOF ) { total = 0; memset( head,-1,sizeof(head) ); for( int i = 2; i <= N; i++ ) { scanf("%d%d",&u,&len); add_edge( i,u,len ); add_edge( u,i,len ); } memset( dp,0,sizeof(dp) ); memset( vis,0,sizeof(vis) ); DFS1( 1 ); memset( vis,0,sizeof(vis) ); for( int i = head[1]; i != -1; i = edge[i].next ) { int v = edge[i].v; DFS2( 1,v ); } for( int i = 1; i <= N; i++ ) printf("%I64d\n",dp[i]); } return 0; }