P1352 没有上司的舞会
题意:你猜
思路:一个点可选可不选,那么假如选,下属就只有一种情况
假如不选,下属就有两种情况,一种选,一种不选
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=6e3+10; 4 int a[maxn]; 5 int dp[maxn][2]; 6 int vis[maxn]; 7 struct node 8 { 9 int v,nxt; 10 }G[maxn*2]; 11 int head[maxn]; int num; 12 void add(int u,int v) 13 { 14 G[++num].v=v;G[num].nxt=head[u];head[u]=num; 15 } 16 void dfs(int u) 17 { 18 dp[u][0]=0;dp[u][1]=a[u]; 19 for(int i=head[u];i;i=G[i].nxt){ 20 int v=G[i].v; 21 dfs(v); 22 dp[u][0]+=max(dp[v][1],dp[v][0]); 23 dp[u][1]+=dp[v][0]; 24 } 25 } 26 int main() 27 { 28 int n; 29 scanf("%d",&n); 30 int rt; 31 for(int i=1;i<=n;i++) scanf("%d",&a[i]); 32 for(int i=1;i<n;i++){ 33 int u,v; 34 scanf("%d%d",&u,&v); 35 add(v,u); 36 vis[u]++; 37 } 38 for(int i=1;i<=n;i++){ 39 if(!vis[i]){ 40 rt=i; 41 break; 42 } 43 } 44 dfs(rt); 45 printf("%d\n",max(dp[rt][1],dp[rt][0])); 46 }