您的位置:首页 > 其它

HDU 2196 Computer( 树上节点的最远距离 )

2015-06-10 21:32 435 查看

Computer

Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4080 Accepted Submission(s): 2043


[align=left]Problem Description[/align]
A school bought the first computer some time ago(so this computer's id is 1). During the recent years the school bought N-1 new computers. Each new computer was connected to one of settled earlier. Managers of school are anxious about slow functioning of the net and want to know the maximum distance Si for which i-th computer needs to send signal (i.e. length of cable to the most distant computer). You need to provide this information.

#include <bits/stdc++.h>
using namespace std ;
const int N = 10010 ;

int dp
[2] , son
[2] , ans
, n ;
int eh
, 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 ;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: