比赛 |
20151026 |
评测结果 |
AAAAAAAAAA |
题目名称 |
火车站饭店 |
最终得分 |
100 |
用户昵称 |
하루Kiev |
运行时间 |
0.255 s |
代码语言 |
C++ |
内存使用 |
61.35 MiB |
提交时间 |
2017-10-16 19:53:34 |
显示代码纯文本
# include "stdio.h"
# include "string.h"
# include "math.h"
# include "iostream"
# include "algorithm"
# define int long long
# define maxn 1000005
using namespace std;
int n,st[maxn],zz,w[maxn],ai,bi;
struct node{int to,next;}e[maxn*2];
void add(int x,int y){
e[++zz].to=y;
e[zz].next=st[x];
st[x]=zz;
}
int f[maxn][2];
void dp(int x,int fa){
f[x][1]+=w[x];
for(int i=st[x];i;i=e[i].next)
if(e[i].to!=fa) dp(e[i].to,x);
for(int i=st[x];i;i=e[i].next){
if(e[i].to==fa) continue;
f[x][1]+=f[e[i].to][0];
f[x][0]+=max(f[e[i].to][0],f[e[i].to][1]);
}
}
signed main(){
freopen("profitz.in","r",stdin);
freopen("profitz.out","w",stdout);
scanf("%lld",&n);
for(int i=1;i<=n;i++) scanf("%d",&w[i]);
for(int i=1;i<n;i++){
scanf("%lld%lld",&ai,&bi);
add(ai,bi);add(bi,ai);
}
dp(1,0);
/*for(int i=1;i<=n;i++)
cout<<f[i][0]<<" "<<f[i][1]<<endl;*/
printf("%lld",max(f[1][1],f[1][0]));
}