dfs+线性dp
从1开始做dfs,初始化dp[i][0],dp[i][1]为1
dp[i][0]表示i节点,不染色的方案数
观察得到dp方程如下:
dp[i][1] =dp[i][1]*((dp[j][1]%mod+dp[j][0]%mod)%mod)%mod;
dp[i][0] = (dp[i][0]*dp[j][1]%mod)%mod;
#include <iostream>
#include <vector>
using namespace std;
const long long mod = 1e9 + 7;
int n;
vector<int> rt[100005];
long long dp[100005][2];
bool vst[100005];
void dfs(int i) {
vst[i] = true;
int ret = 0;
for (int j : rt[i]) {
if (vst[j]) continue;
dfs(j);
dp[i][1] =dp[i][1]*((dp[j][1]%mod+dp[j][0]%mod)%mod)%mod;
dp[i][0] = (dp[i][0]*dp[j][1]%mod)%mod;
ret = 1;
}
}
int main() {
cin >> n;
for(int i=1;i<=n;i++){
dp[i][1]=1;
dp[i][0]=1;
}
for (int i = 0; i < n - 1; i++) {
int u, v;
cin >> u >> v;
rt[u].push_back(v);
rt[v].push_back(u);
}
dfs(1);
cout << (dp[1][0] + dp[1][1]) % mod;
}

京公网安备 11010502036488号