HDOJ 1520 Anniversary party(树DP)
题意:求树的最大点独立集中点的数目。
View Code
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; #define N 6001 int n,e; int w[N],first[N],next[N],v[N],p[N]; int dp[N][2]; void init() { e=0; memset(first,-1,sizeof(first)); memset(p,0,sizeof(p)); memset(dp,0,sizeof(dp)); } void add(int a,int b) { v[e]=b; next[e]=first[a]; first[a]=e++; } void dfs(int a) { dp[a][0]=0; dp[a][1]=w[a]; int i,b; for(i=first[a];~i;i=next[i]) { b=v[i]; if(b==p[a]) continue; dfs(b); dp[a][0]+=max(dp[b][0],dp[b][1]); dp[a][1]+=dp[b][0]; } } int main() { int a,b; while(~scanf("%d",&n)) { init(); for(int i=1;i<=n;i++) scanf("%d",&w[i]); do { scanf("%d%d",&a,&b); if(!p[a]) { p[a]=b; add(b,a); } }while(a|b); for(int i=1;i<=n;i++) { if(p[i]==0) { dfs(i); printf("%d\n",max(dp[i][0],dp[i][1])); break; } } } return 0; }