没有上司的舞会....初一就做过了.....
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> #define MAXN 6005 using namespace std; int n,tot,ans; int a[MAXN],h[MAXN],in[MAXN],f[MAXN][3]; struct node{ int from,to,next; }e[MAXN<<1]; void init(){ tot=ans=0; memset(h,-1,sizeof(h)); memset(in,0,sizeof(in)); memset(f,0,sizeof(f)); } void add(int x,int y){ tot++; e[tot].from=x; e[tot].to=y; e[tot].next=h[x]; h[x]=tot; } int dfs(int now,int fa){ f[now][1]=a[now]; f[now][0]=0; for(int i=h[now];i!=(-1);i=e[i].next){ dfs(e[i].to,now); f[now][1]=max(f[now][1],f[now][1]+f[e[i].to][0]); f[now][0]=max(f[now][0],f[now][0]+max(f[e[i].to][0],f[e[i].to][1])); } } int main(){ while(scanf("%d",&n)==1){ for(int i=1;i<=n;i++)scanf("%d",&a[i]); init(); while(1){ int x,y;cin>>x>>y;if(x==0&&y==0)break; add(y,x); in[x]++; } for(int i=1;i<=n;i++){ if(in[i]==0){ dfs(i,i); ans+=max(f[i][0],f[i][1]); } } cout<<ans<<endl; } }