记录编号 333314 评测结果 AAAAAAAAAA
题目名称 火车站饭店 最终得分 100
用户昵称 GravatarJanis 是否通过 通过
代码语言 C++ 运行时间 1.132 s
提交时间 2016-10-30 15:29:10 内存使用 18.31 MiB
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;

const int maxn = 100000 + 10;
int G[maxn][51], value[maxn], dp[maxn][2], waynum[maxn];
bool vis[maxn][51];
int n;

void Init(){
	scanf("%d",&n);
	for(int i = 1; i <= n; i++)scanf("%d",&value[i]);
	for(int i = 1; i <= n-1; i++){
		int x,y;
		scanf("%d%d",&x,&y);
		G[x][waynum[x]++] = y;
		G[y][waynum[y]++] = x;
	}
}
void DP(int pos){
	int temp(0), temp2(0);
	for(int i = 0; i < waynum[pos]; i++){
		if(!vis[pos][i]){
			for(int j = 0; j < waynum[G[pos][i]]; j++){
				if(G[G[pos][i]][j] == pos){
					vis[G[pos][i]][j] = 1;
					break;
				}
			}
			DP(G[pos][i]);
			temp += max(dp[G[pos][i]][1],dp[G[pos][i]][0]);
			temp2 += dp[G[pos][i]][0];
		}
		dp[pos][0] = temp;
		dp[pos][1] = temp2 + value[pos];
	}
}
int main(){
	#ifndef DEBUG
		string FileName="profitz";
		freopen((FileName+".in").c_str(),"r",stdin);
		freopen((FileName+".out").c_str(),"w",stdout);
	#endif
	Init();
	DP(1);
	printf("%d",max(dp[1][0],dp[1][1]));
}