【题解】
直接做树形DP即可。f[i]表示取i及其子树的最大的美丽指数,若某个儿子son满足f[son]>0,f[i]就加上f[son].
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define LL long long 5 #define N 200010 6 #define rg register 7 using namespace std; 8 int n,m,ans=-2e9,tot,last[N],f[N]; 9 struct edge{ 10 int to,pre; 11 }e[N]; 12 inline int read(){ 13 int k=0,f=1; char c=getchar(); 14 while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar(); 15 while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar(); 16 return k*f; 17 } 18 void dfs(int x,int fa){ 19 for(rg int i=last[x],to;i;i=e[i].pre)if((to=e[i].to)!=fa){ 20 dfs(to,x); if(f[to]>0) f[x]+=f[to]; 21 } 22 ans=max(ans,f[x]); 23 } 24 int main(){ 25 n=read(); 26 for(rg int i=1;i<=n;i++) f[i]=read(); 27 for(rg int i=1;i<n;i++){ 28 int u=read(),v=read(); 29 e[++tot]=(edge){v,last[u]}; last[u]=tot; 30 e[++tot]=(edge){u,last[v]}; last[v]=tot; 31 } 32 dfs(1,0); 33 printf("%d\n",ans); 34 }