HDU 2196

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

  

原文地址:https://www.cnblogs.com/wulangzhou/p/3086960.html