树形dp,采用左儿子右兄弟的方式来存储,然后采用递归的方式dp。动规方程很简单,类似于01背包的情况。这里就不在写了。具体的见程序。程序如下:
/*
ID :csuchenan
PROG: hdoj 1520 Anniversary party
LANG: C++
*/
#include<stdio.h>
#define MAXN 6010
struct Node{
int far ;
int bro ;
int chl ;
int take ;
int nott ;
int maxval(){
return take > nott ? take : nott ;
}
void init(){
far = 0 ;
bro = 0 ;
chl = 0 ;
take = 0 ;
nott = 0 ;
}
}node[MAXN] ;
int n ;
bool init() ;
void work() ;
void dfs(int);
int main(){
while(init())
work() ;
return 0 ;
}
bool init(){
if(scanf("%d" , &n)!=1)
return 0 ;
int i ;
for(i = 1 ; i <= n ; i ++){
node[i].init() ;
scanf("%d" , &node[i].take) ;
}
int p ;
int q ;
scanf("%d %d" , &p , &q) ;
while(p && q){
node[p].far = q ;
node[p].bro = node[q].chl ;
node[q].chl = p ;
scanf("%d %d" , &p , &q) ;
}
return 1 ;
}
void work(){
int i ;
for(i = 1 ; i <= n ; i ++){
if(!node[i].far){
dfs(i) ;
break ;
}
}
printf("%d\n" , node[i].maxval()) ;
return ;
}
void dfs(int index){
int child = node[index].chl ;
while(child){
dfs(child) ;
node[index].take += node[child].nott ;
node[index].nott += node[child].maxval() ;
child = node[child].bro ;
}
}