记录编号 |
240928 |
评测结果 |
AAAAAAAAAA |
题目名称 |
修剪花卉 |
最终得分 |
100 |
用户昵称 |
Fmuckss |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.020 s |
提交时间 |
2016-03-24 08:37:31 |
内存使用 |
0.79 MiB |
显示代码纯文本
#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);
}