June 23, 2020
条件から与えられるグラフが木であることがわかる。制約を満たすようにノードを白/黒に塗る問題。木DP。
木の再帰的な構造を生かして、DFSしつつ、部分木について根を白/黒に塗る場合の部分木全体の塗り方を求める。
#define MOD 1'000'000'007 using mint = Fp<MOD>; #define MAX_N 100'000 mint dp[MAX_N][2]; vector<i64> G[MAX_N]; bool seen[MAX_N]; void dfs(i64 u) { seen[u] = true; mint cntW = 1; mint cntB = 1; for (i64 v : G[u]) { if (seen[v]) continue; dfs(v); cntW *= (dp[v][0] + dp[v][1]); cntB *= dp[v][1]; } dp[u][0] = cntB; dp[u][1] = cntW; } int main() { i64 N; cin >> N; REP(i, N - 1) { i64 u, v; cin >> u >> v; u--, v--; G[u].pb(v); G[v].pb(u); } dfs(0); cout << (dp[0][0] + dp[0][1]) << endl; return 0; }