比赛 20160323 评测结果 AAAAAAAAAA
题目名称 修剪花卉 最终得分 100
用户昵称 Fmuckss 运行时间 0.020 s
代码语言 C++ 内存使用 0.79 MiB
提交时间 2016-03-23 21:47:44
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 20005;
struct edge {
	int to, ne;
	edge() {}
	edge(int to_, int ne_) { to = to_, ne = ne_; }
}e[maxn<<1];
int head[maxn], tot;
bool vis[maxn];
void add_edge(int fr, int to) {
	e[++tot] = edge(to, head[fr]); head[fr] = tot;
	e[++tot] = edge(fr, head[to]); head[to] = tot;
}
int f[maxn];
int n, ans;
void read() {
	scanf("%d", &n);
	for(int i = 1; i <= n; i++) {
		scanf("%d", &f[i]);
	}
	int a, b;
	for(int i = 1; i < n; i++) {
		scanf("%d %d", &a, &b);
		add_edge(a, b);
	}
}
void dp(int now) {
	vis[now] = true;
	for(int i = head[now]; i; i = e[i].ne) {
		int to = e[i].to;
		if(vis[to]) continue;
		dp(to);
		f[now] = max(f[now], f[now]+f[to]);
	}
	ans = max(ans, f[now]);
}
int main() {
	freopen("makeup.in", "r", stdin);
	freopen("makeup.out", "w", stdout);
	read();
	dp(1);
	printf("%d", ans);
}