Anniversary party POJ - 2342

Posted gredcomet

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Anniversary party POJ - 2342相关的知识,希望对你有一定的参考价值。

题目链接
经典的树形dp,最大独立集,对于每个点就有2个状态,选/不选
(dp_{i,0})表示不选第i个,(dp_{i,1})表示选第i个,容易得到其状态转移
(dp_{i,0} = sum{max(dp_{j,0}, dp_{j,1})}(j为i的儿子节点))
(dp_{i,1} = rating_i + sum{dp_{j,0}})

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

const int maxn = 6007;
vector<int> son[maxn];
int rating[maxn], in[maxn], dp[maxn][2];

void dfs(int fa) {
    for(int i = 0; i < son[fa].size(); ++i) {
        int v = son[fa][i];
        dfs(v);
        dp[fa][0] += max(dp[v][0], dp[v][1]);
        dp[fa][1] += dp[v][0];
    }
}

void run_case() {
    int n; 
    while(cin >> n) {
        if(n == 0) {
            cin >> n;
            return;
        }
        for(int i = 1; i <= n; ++i) {
            cin >> rating[i];
            dp[i][0] = 0;
            dp[i][1] = rating[i];
            in[i] = 0;
            son[i].clear();
        }
        for(int i = 1; i < n; ++i) {
            int u, v;
            cin >> v >> u;
            in[v]++;
            son[u].push_back(v);
        }
        for(int i = 1; i <= n; ++i)
            if(!in[i]) {
                dfs(i);
                cout << max(dp[i][0], dp[i][1]) << "
";
                break;
            }
    }
    
}


int main() {
    ios::sync_with_stdio(false), cout.tie(0);
    cout.flags(ios::fixed);cout.precision(10);
    run_case();
    cout.flush();
    return 0;
}

以上是关于Anniversary party POJ - 2342的主要内容,如果未能解决你的问题,请参考以下文章

POJ 2342?Anniversary party

POJ2342 Anniversary party

poj2342 Anniversary party

POJ 2342 Anniversary party

poj2342 Anniversary party (树形dp)

POJ 2342 Anniversary party(树形dp)