比赛 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;
}