标签:
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4080 Accepted Submission(s): 2043
#include <bits/stdc++.h> using namespace std ; const int N = 10010 ; int dp[N][2] , son[N][2] , ans[N] , n ; int eh[N] , et[N<<1] , nxt[N<<1] , ew[N<<1] , tot ; void init() { memset( eh , -1 , sizeof eh ); tot = 0 ; } void addedge( int u , int v , int w ) { et[tot] = v ; ew[tot] = w ; nxt[tot] = eh[u] ; eh[u] = tot++ ; et[tot] = u ; ew[tot] = w ; nxt[tot] = eh[v] ; eh[v] = tot++ ; } int Dp( int u , int fa ) { for( int i = eh[u] ; ~i ; i = nxt[i] ) { int v = et[i] , w = ew[i] ; if( v == fa ) continue ; int tmp = Dp( v , u ) + w ; if( tmp > dp[u][1] ) { dp[u][1] = tmp ; son[u][1] = v ; } if( dp[u][1] > dp[u][0] ) { swap( dp[u][1] , dp[u][0] ) ; swap( son[u][1] , son[u][0]) ; } } return dp[u][0] ; } void Solve( int u , int fa , int tmp ) { ans[u] = max( dp[u][0] , tmp ) ; for( int i = eh[u] ; ~i ; i = nxt[i] ) { int v = et[i] , w = ew[i] ; if( v == fa ) continue ; if( v == son[u][0] ) { Solve( v , u , max( dp[u][1] , tmp ) + w ) ; } else { Solve( v , u , max( dp[u][0] , tmp ) + w ) ; } } } int main () { while( ~scanf("%d",&n) ) { init(); for( int i = 2 ; i <= n ; ++i ) { int v , w ; scanf("%d%d",&v,&w); addedge( i , v , w ) ; } memset( dp , 0 , sizeof dp ) ; Dp( 1 , 0 ); //for( int i = 1 ; i <= n ; ++i ) cout << i << ‘ ‘ << dp[i][0] << ‘ ‘ << dp[i][1] << endl ; Solve( 1 , 0 , 0 ); for( int i = 1 ; i <= n ; ++i ) printf("%d\n",ans[i]); } return 0 ; }
HDU 2196 Computer( 树上节点的最远距离 )
标签:
原文地址:http://www.cnblogs.com/hlmark/p/4567324.html