不枉我SGU134卡了半天,这道题纯练手了,果断1A了~
类似SGU134,预处理下,然后找到这个无向图之间的关系,思路够清晰的话应该不会错。
PS:看别人思路去学习没什么可耻的,但不能过分依赖而放弃思考。
//SGU 143 Long Live the Queen
//树形DP
//by night_watcher
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
#define N 16001
int val[N];
int uper[N];
int tv[N];
int head[N];
int n;
int cnt;
struct NODE{
int v,next;
}node[N*2];
void addedge(int u,int v){
node[cnt].v=v;
node[cnt].next=head[u];
head[u]=cnt++;
}
void dfs(int k,int fa){
uper[k]=fa;
tv[k]=val[k];
for(int i=head[k];i!=-1;i=node[i].next){
int v=node[i].v;
if(v!=fa){
dfs(v,k);
if(tv[v]>=0){
tv[k]+=tv[v];
}
}
}
return ;
}
int main(){
int i,j,v,u;
cin>>n;
cnt=0;
for(i=1;i<=n;i++) cin>>val[i];
memset(head,-1,sizeof(head));
for(i=0;i<n-1;i++){
cin>>u>>v;
addedge(u,v);
addedge(v,u);
}
dfs(1,0);
int maxn=tv[1];
for(i=2;i<n;i++){
int temp=tv[i];
v=uper[i];
if(tv[i]>0&&tv[v]-tv[i]>0){
temp+=tv[v]-tv[i];
}
if(tv[i]<0&&tv[v]>0){
temp+=tv[v];
}
maxn=max(maxn,temp);
}
cout<<maxn<<endl;
return 0;
}