链接 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;
}