• 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;
    }
    

      

  • 相关阅读:
    林大妈的JavaScript基础知识(二):编写JavaScript代码前的一些简单工作
    林大妈的JavaScript基础知识(一):JavaScript简史
    制作X509证书
    浏览器对象模型
    JS事件
    CSS操作
    Element节点
    Document节点
    Dom中的一些接口
    DOM节点的属性和方法
  • 原文地址:https://www.cnblogs.com/wulangzhou/p/3086960.html
Copyright © 2020-2023  润新知