比赛 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;
}