Solution
考虑树形dp, 表示以
为根的子树至少含有一个黑节点的方案数(全白的后面+1即可)
那么考虑两种情况
染为黑色, 则子节点为什么颜色都无所谓,
(
为子节点), 其中1表示子结点的子树全为1
染为白色, 则子节点必须只有一个黑,
(
为子节点)
那么最后答案就是 加上空集的方案 即一个黑都没有
Code
/*
autor: Kurisu
2020年4月26日19:14:26
*/
#include<bits/stdc++.h>
using namespace std;
const long long inf = 1e18;
const int N = 1e6 + 5;
const double eps = 1e-10;
const int mod = 1e9 + 7;
typedef long long ll;
struct Edge{
int v, nextz;
}edge[N << 1];
int head[N], tot;
ll qpow(ll a, ll b) {
ll res = 1;
while(b) {
if(b & 1) res = res * a % mod;
a = a * a % mod;
b >>= 1;
}
return res;
}
void addedge(int u, int v) {
edge[tot].v = v;
edge[tot].nextz = head[u];
head[u] = tot++;
}
ll dp[N];
void dfs(int u, int fa) {
dp[u] = 1;
ll res = 0;
for(int i = head[u]; ~i; i = edge[i].nextz) {
int v = edge[i].v;
if(v == fa) continue;
dfs(v, u);
dp[u] *= (1 + dp[v]); // 当前为黑
dp[u] %= mod;
res = (res + dp[v]) % mod; // 当前为白
}
dp[u] += res;
}
int main() {
ios::sync_with_stdio(false), cin.tie(nullptr);
int n;
memset(head, -1, sizeof(head));
cin >> n;
for(int i = 1; i <= n - 1; i++) {
int u, v;
cin >> u >> v;
addedge(u, v);
addedge(v, u);
}
dfs(1, -1);
cout << (dp[1] + 1) % mod << "\n";
return 0;
} 
京公网安备 11010502036488号