http://acm.bjtu.edu.cn/vjudge/problem/viewProblem.action?id=669
最最基础的树形dp,父子兄弟结构太爽了,学自hh博客
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> using namespace std ; struct Tree{ int father ; int child ; int brother ; int happy ; int temp ; int MAX(){ return max(happy,temp) ; } void init(){ father=child=brother=temp=0 ; } }tree[6001] ; void dfs(int idx) { int child ; child=tree[idx].child ; while(child) { dfs(child) ; tree[idx].happy+=tree[child].temp ; tree[idx].temp+=tree[child].MAX() ; child=tree[child].brother ; } } int main() { int n ; while(~scanf("%d",&n)) { for(int i=1;i<=n;i++) { scanf("%d",&tree[i].happy) ; tree[i].init() ; } int l,k ; while(scanf("%d%d",&l,&k),l||k) { tree[l].father=k ; tree[l].brother=tree[k].child ; tree[k].child=l ; } for(int i=1;i<=n;i++) if(!tree[i].father) { dfs(i) ; printf("%d\n",tree[i].MAX()) ; break ; } } return 0 ; }