题目:https://www.luogu.org/problemnew/show/P1352
代码如下:
#include<iostream> #include<cstdio> using namespace std; int n,r[6005],cnt[6005],f[6005][3],ct,ans; bool vis[6005]; struct N{ int to,next; }edge[6005]; void add(int x,int y) { ct++; edge[ct].to=y; edge[ct].next=cnt[x]; cnt[x]=ct; } void dfs(int nw) { f[nw][1]=r[nw]; for(int i=cnt[nw];i;i=edge[i].next) { dfs(edge[i].to); f[nw][1]+=f[edge[i].to][0];//! f[nw][0]+=max(f[edge[i].to][1],f[edge[i].to][0]); } // return max(f[nw][1],f[nw][0]); } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&r[i]); for(int i=1;i<=n;i++) { int a,b; scanf("%d%d",&a,&b); if(!a&&!b)break; add(b,a); vis[a]=1; } for(int i=1;i<=n;i++) if(!vis[i]) { dfs(i); ans+=max(f[i][1],f[i][0]); } printf("%d",ans); return 0; }