题目
分析
- 大概算个暴力??树形DP
- 设f[i][0]为选择当前节点,f[i][1]为不选择当前节点
- 如果当前节点选,那么就乘上他所有的子节点
- 如果不选,那么就乘上他所有子节点选和不选的方案数和
代码
1 #include<iostream>
2 #include<vector>
3 #include<algorithm>
4 #define mod 10081
5 using namespace std;
6 vector <int> e[100010];
7 int flag[100010];
8 int f[100010][2];
9 void dfs(int x)
10 {
11 for(int i=0;i<e[x].size();i++)
12 {
13 if (!flag[e[x][i]])
14 {
15 flag[e[x][i]]=1;
16 dfs(e[x][i]);
17 f[x][1]=(long long)(f[x][1]*f[e[x][i]][0])%mod;
18 f[x][0]=(f[e[x][i]][0]+f[e[x][i]][1])%mod*f[x][0]%mod;
19 }
20 }
21 }
22 int main ()
23 {
24 int n;
25 cin>>n;
26 for (int i=1,x,y;i<=n-1;i++)
27 {
28 cin>>x>>y;
29 e[x].push_back(y);
30 e[y].push_back(x);
31 }
32 for (int i=1;i<=n;i++) sort(e[i].begin(),e[i].end());
33 for (int i=1;i<=n;i++) f[i][0]=f[i][1]=1;
34 flag[1]=1;
35 dfs(1);
36 cout<<(f[1][0]+f[1][1])%mod;
37 }