题意:给出一颗树,求它的所有子树的总数。
思路:定义一个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; }