比赛 |
20111109 |
评测结果 |
AAAAAAAAAA |
题目名称 |
火车站饭店 |
最终得分 |
100 |
用户昵称 |
王者自由 |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2011-11-09 09:34:52 |
显示代码纯文本
#include <cstdio>
const int MAXN = 100010;
int n, x, y, a[MAXN], G[MAXN][60];
int s, f[MAXN], g[MAXN];
inline int max(int a, int b) {
return a>b?a:b;
}
void DP(int i, int p) {
if(G[i][0] == 1 && G[i][1] == p)
f[i] = 0, g[i] = a[i];
else {
for(int j=1; j<=G[i][0]; j++) {
int k = G[i][j];
if(k != p)
DP(k, i);
}
f[i] = 0, g[i] = a[i];
for(int j=1; j<=G[i][0]; j++) {
int k = G[i][j];
if(k != p) {
f[i] += max(f[k], g[k]);
g[i] += f[k];
}
}
}
}
int main() {
freopen("profitz.in","r",stdin);
freopen("profitz.out","w",stdout);
scanf("%d", &n);
for(int i=1; i<=n; i++)
scanf("%d", a+i);
for(int i=1; i<n; i++) {
scanf("%d %d", &x, &y);
G[x][++G[x][0]] = y;
G[y][++G[y][0]] = x;
}
/*for(int i=1; i<=n; i++) {
fprintf(stderr, "%d(%d): ", i, a[i]);
f[i] = 0; g[i] = a[i];
for(int j=1; j<=G[i][0]; j++) {
int k = G[i][j];
fprintf(stderr, "%d ", k);
printf("[%d %d]\n", f[k], g[k]);
f[i] += max(f[k], g[k]);
g[i] += f[k];
}
printf("%d %d\n", f[i], g[i]);
s = max(s, max(f[i], g[i]));
fprintf(stderr, "\n");
}*/
DP(1, 0);
s = max(f[1], g[1]);
printf("%d\n", s);
return 0;
}