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