<-- home

AtCoder ABC 036 D

D - 塗り絵

条件から与えられるグラフが木であることがわかる。制約を満たすようにノードを白/黒に塗る問題。木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;
}