比赛 |
20151026 |
评测结果 |
AAAAAAAAAA |
题目名称 |
火车站饭店 |
最终得分 |
100 |
用户昵称 |
hunter |
运行时间 |
0.255 s |
代码语言 |
C++ |
内存使用 |
4.22 MiB |
提交时间 |
2017-10-16 19:41:07 |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 100005
#define LL long long
using namespace std;
int n;
int a[maxn];
struct edge
{
int to,ne;
}b[maxn*2];
int k=0,head[maxn];
LL f[maxn][2];
bool vis[maxn];
void add(int u,int v)
{
k++;
b[k].to=v; b[k].ne=head[u]; head[u]=k;
}
void dp(int x)
{
vis[x]=1;
f[x][1]=(LL)a[x],f[x][0]=0;
for(int i=head[x];i!=-1;i=b[i].ne)
if(!vis[b[i].to])
{
dp(b[i].to);
f[x][0]+=max(f[b[i].to][0],f[b[i].to][1]);
f[x][1]+=f[b[i].to][0];
}
}
int main()
{
freopen("profitz.in","r",stdin);
freopen("profitz.out","w",stdout);
memset(head,-1,sizeof(head));
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
int x,y;
for(int i=1;i<n;i++){
scanf("%d%d",&x,&y);
add(x,y); add(y,x);
}
dp(1);
printf("%lld\n",max(f[1][0],f[1][1]));
return 0;
}