1. 程式人生 > >Codeforces Round #263 (Div. 2) D. Appleman and Tree 樹形dp

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

鏈接 樹形dp targe 代碼 else 多少 color turn def

鏈接:

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