比赛 20151026 评测结果 AAAAAAAAAA
题目名称 火车站饭店 最终得分 100
用户昵称 L1143 运行时间 0.481 s
代码语言 C++ 内存使用 4.50 MiB
提交时间 2015-10-26 20:07:26
显示代码纯文本
#include<cstdio>
#include<vector>
#define MAXN 100001
using namespace std;
int fa[MAXN],left[MAXN],right[MAXN],n,w[MAXN];
long long f[MAXN][2];
vector<int>aa[MAXN];

void _make(int p){
	int i,g;
	for(i=0;i<aa[p].size();i++){
		g=aa[p][i];
		if(fa[p]!=g){
			fa[g]=p;
			right[g]=left[p];
			left[p]=g;
			_make(g);
		}
	}
}

long long _max(long long a,long long b){if(a>b)return a; return b;}

void _dfs(int p){
	int i,g;
	if(!left[p]){
		f[p][0]=w[p];
		f[p][1]=0;
		return ;
	}
	g=left[p];
	while(g){
		_dfs(g);
		g=right[g];
	}
	g=left[p];
	while(g){
		f[p][1]+=_max(f[g][0],f[g][1]);
		f[p][0]+=f[g][1];
		g=right[g];
	}
	f[p][0]+=w[p];
}

int main(){
	freopen("profitz.in","r",stdin);
	freopen("profitz.out","w",stdout);
	int i,x,y;
	scanf("%d",&n);
	for(i=1;i<=n;i++)scanf("%d",&w[i]);
	for(i=1;i<n;i++){
		scanf("%d%d",&x,&y);
		aa[x].push_back(y);
		aa[y].push_back(x);
	}
	_make(1);
	_dfs(1);
	printf("%I64d",_max(f[1][0],f[1][1]));
	return 0;
}