HDU 1520 Anniversary party——树形dp

来源:互联网 发布:大连品牌网络推广公司 编辑:程序博客网 时间:2024/06/06 12:24

入门题

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <vector>#define IN freopen("in.txt". "r", stdin)#define OUT freopen("out.txt", "w", stdout);using namespace std;const int maxn = 1e4;const int INF = 0x3f3f3f3f;int n, dp[maxn][2], par[maxn];vector<int> g[maxn];void dfs(int root) {    for (unsigned int i = 0; i < g[root].size(); i++) {        dfs(g[root][i]);    }    for (unsigned int i = 0; i < g[root].size(); i++) {        dp[root][0] += max(dp[g[root][i]][0], dp[g[root][i]][1]);        dp[root][1] += dp[g[root][i]][0];    }}int main() {    while (~scanf("%d", &n)) {        memset(dp, 0, sizeof(dp));        memset(par, -1, sizeof(par));        for (int i = 1; i <= n; i++) {            scanf("%d", &dp[i][1]);            g[i].clear();        }        int u, v;        while (~scanf("%d %d", &u, &v) && u && v) {            par[u] = v;            g[v].push_back(u);        }        int root = 1;        while (par[root] != -1) root = par[root];        dfs(root);        printf("%d\n", max(dp[root][1], dp[root][0]));    }    return 0;}