hdu 1520

链接 http://acm.hdu.edu.cn/status.php

#include<iostream>
#include<stdio.h>
#include<cstring>
#include<algorithm>
#define max( a,b ) ( (a)>(b)?(a):(b) )
using namespace std;

struct date
{
    int v,next;
}edge[2000000];
int N,total,head[6004],dp[6004][2];
bool vis[6004];
void add_edge( int u,int v )
{
    edge[total].v = v;
    edge[total].next = head[u];
    head[u] = total++;
}
void DFS( int sta )
{
    for( int i = head[sta]; i != -1; i = edge[i].next )
    {
        int v = edge[i].v; DFS( v );
        dp[sta][0] += max( dp[v][0],dp[v][1] );
        dp[sta][1] +=      dp[v][0];
    }
}
int main( )
{
    int u,v,tab;
    while( scanf("%d",&N) != EOF )
    {
        total = 0;
        memset( head,-1,sizeof(head) );
        memset( vis,false,sizeof(vis) );
        memset( dp,0,sizeof(dp) );
        for( int i = 1; i <= N; i++ )
            scanf("%d",&dp[i][1]);
        while( scanf("%d%d",&u,&v) )
        {
            if( u == 0 && v == 0 )break;
            add_edge( v,u );
            vis[u] = true;
        }
        for( int i = 1; i <= N; i++ )
        if( !vis[i] )
        {
           tab = i; DFS( i ); break;
        }
        printf("%d\n",max( dp[tab][0],dp[tab][1] ));
    }
    return 0;
}

  

posted on 2013-05-18 14:51  浪舟  阅读(154)  评论(0编辑  收藏  举报

导航