1. 程式人生 > >【HDU】1520 Anniversary party(樹形dp)

【HDU】1520 Anniversary party(樹形dp)

pre ret set rsa main eof hdu opened event

題目

題目


分析

帶權值的樹上最大獨立集


代碼

技術分享圖片
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=6005;
 4 int a[maxn], n, fa[maxn];
 5 vector<int> son[maxn];
 6 
 7 int dp(int u)
 8 {
 9     int sum1=a[u],sum2=0;
10     if(son[u].empty())
11     {
12         return
a[u]; 13 } 14 for(int i=0;i<son[u].size();i++) 15 { 16 for(int j=0;j<son[son[u][i]].size();j++) 17 sum1+=dp(son[son[u][i]][j]); 18 sum2+=dp(son[u][i]); 19 } 20 int ans=max(sum1,sum2); 21 return ans; 22 } 23 int main() 24 { 25 int k,l;
26 while(scanf("%d",&n)==1) 27 { 28 for(int i=1; i<=n;i++) scanf("%d",&a[i]); 29 while(scanf("%d%d",&k,&l) && k) 30 { 31 son[l].push_back(k); 32 fa[k]=1; 33 } 34 int Be=1; 35 for(int i=1
;i<=n;i++) 36 if(!fa[i]) { Be=i; break; } 37 38 printf("%d\n",dp(Be)); 39 40 for(int i=1;i<=n+1;i++) son[i].clear(); 41 memset(fa,0,sizeof(fa)); 42 } 43 44 return 0; 45 }
View Code

【HDU】1520 Anniversary party(樹形dp)