Codeforces Round #263 (Div. 2) D. Appleman and Tree 树形dp

Posted Flowersea

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #263 (Div. 2) D. Appleman and Tree 树形dp相关的知识,希望对你有一定的参考价值。

链接:

http://codeforces.com/contest/462/problem/D

题意:

给定n个点的树,

0为根,下面n-1行表示每个点的父节点

最后一行n个数 表示每个点的颜色,0为白色,1为黑色。

把树分成若干个联通块使得每个联通块有且仅有一个黑点,问有多少种分法(结果mod1e9+7)

题解:

树形dp,每个点有2个状态,已经归属于某个黑点和未归属于某个黑点。

代码:

31 int n;
32 int x[MAXN];
33 VI G[MAXN];
34 ll dp[MAXN][2];
35 
36 void dfs(int u) {
37     if (x[u]) dp[u][1] = 1;
38     else dp[u][0] = 1;
39     rep(i, 0, G[u].size()) {
40         int v = G[u][i];
41         dfs(v);
42         ll old[2] = { dp[u][0], dp[u][1] };
43         dp[u][0] = (old[0] * dp[v][1] + old[0] * dp[v][0]) % MOD;
44         dp[u][1] = (old[1] * dp[v][1] + old[1] * dp[v][0] + old[0] * dp[v][1]) % MOD;
45     }
46 }
47 
48 int main() {
49     ios::sync_with_stdio(false), cin.tie(0);
50     cin >> n;
51     rep(i, 1, n) {
52         int p;
53         cin >> p;
54         G[p].pb(i);
55     }
56     rep(i, 0, n) cin >> x[i];
57     dfs(0);
58     cout << dp[0][1] << endl;
59     return 0;
60 }

 

以上是关于Codeforces Round #263 (Div. 2) D. Appleman and Tree 树形dp的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #436 E. Fire(背包dp+输出路径)

[ACM]Codeforces Round #534 (Div. 2)

Codeforces Round #726 (Div. 2) B. Bad Boy(贪心)

Codeforces 263E Rhombus (看题解)

Codeforces Global Round 19

Codeforces Educational Codeforces Round 67