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