洛谷1352没有上司的舞会——树型dp
题目:https://www.luogu.org/problemnew/show/P1352
#include<iostream> #include<cstdio> using namespace std; int n,a[6005],l[6005],cnt,x,y,f[6005][2],sum; struct Node{ int to,next; }edge[6005]; bool b[6005],rd[6005]; void add(int x,int y) { cnt++; edge[cnt].next=l[x]; edge[cnt].to=y; l[x]=cnt; rd[y]=1; } void dfs(int cur) { if(b[cur])return; for(int i=l[cur];i;i=edge[i].next) { int v=edge[i].to; dfs(v); f[cur][0]+=max(f[v][0],f[v][1]); f[cur][1]+=f[v][0]; } f[cur][1]+=a[cur]; b[cur]=1; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) { scanf("%d%d",&x,&y); add(y,x); } for(int i=1;i<=n;i++) { dfs(i); if(!rd[i])sum=max(sum,sum+max(f[i][0],f[i][1])); } printf("%d",sum); return 0; }