题意:给出一颗树,求它的所有子树的总数。
思路:定义一个dp[],dp[u]是指以u为结点的子树的个数。
可以推出:对于u所有的直接子节点v,dp[u]=dp[u]*(dp[v]+1);
可以理解为(dp[v]+1)是在v结点形成的所有子树中加入一个u结点这样形成的一定含有u结点的子树总数。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 200000 + 10;
const int INF=int(1e9);
const int mod=10000007;
#define ll long long
vector<int>edge[maxn];
bool vis[maxn];
ll dp[maxn];
void init(int n) {
for(int i=0; i<=n; i++)
edge[i].clear();
memset(vis,0,sizeof(vis));
}
void dfs(int u) {
vis[u]=true;
dp[u]=1;
for(int i=0; i<edge[u].size(); i++) {
int v=edge[u][i];
if(vis[v])
continue;
dfs(v);
dp[u]=dp[u]*(dp[v]+1)%mod;
}
return;
}
int main() {
int n;
int u,v;
scanf("%d",&n);
init(n);
for(int i=1; i<=n-1; i++) {
scanf("%d %d",&u,&v);
edge[u].push_back(v);
edge[v].push_back(u);
}
dfs(1);
ll ans=0;
for(int i=1; i<=n; i++)
ans=(ans+dp[i])%mod;
printf("%lld\n",ans);
return 0;
}