现在的位置: 首页 > 综合 > 正文

没有上司的舞会 (树形DP)

2018年01月13日 ⁄ 综合 ⁄ 共 800字 ⁄ 字号 评论关闭
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
#define inf 0x7fffffff

inline int read() {
    int x = 0, f = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9') {
        if (ch == '-')f = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9') {
        x = x * 10 + ch - '0';
        ch = getchar();
    }
    return x*f;
}

struct edge {
    int to, next;
} e[6001];
int n, cnt, a[6001], head[6001], f[6001][2];
bool in[6001];

inline void ins(int u, int v) {
    e[++cnt] = (edge){v, head[u]};
    head[u] = cnt;
}

inline void dp(int x) {
    f[x][1] = a[x];
    for (int i = head[x]; i; i = e[i].next) {
        dp(e[i].to);
        f[x][1] += f[e[i].to][0];
        f[x][0] += max(f[e[i].to][1], f[e[i].to][0]);
    }
}

int main() {
    n = read();
    for (int i = 1; i <= n; i++)
        a[i] = read();
    for (int i = 1; i <= n; i++) {
        int l = read(), k = read();
        if (!l&&!k)break;
        ins(k, l);
        in[l] = 1;
    }
    for (int i = 1; i <= n; i++) {
        if (!in[i]) {
            dp(i);
            printf("%d", max(f[i][1], f[i][0]));
            return 0;
        }
    }
}

抱歉!评论已关闭.