正题
题目大意:https://www.luogu.org/problem/P2796
题目大意
求一棵树中有多少个子树。
解题思路
考虑
d
p
dp
dp。
f
i
f_i
fi表示已
i
i
i这个点为根的子树个数。
动态转移方程
f
x
=
∏
x
−
>
y
(
f
y
+
1
)
f_x=\prod_{x->y}(f_y+1)
fx=x−>y∏(fy+1)
答案就是 ∑ i = 1 n f i \sum_{i=1}^nf_i i=1∑nfi
c o d e code code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=110000,XJQ=1e9+7;
struct node{
ll to,next;
}a[N*2];
ll n,ls[N],f[N],tot,ans;
void addl(ll x,ll y)
{
a[++tot].to=y;
a[tot].next=ls[x];
ls[x]=tot;
}
void dp(ll x,ll fa)
{
f[x]=1;
for(ll i=ls[x];i;i=a[i].next){
ll y=a[i].to;
if(y==fa) continue;
dp(y,x);
f[x]=f[x]*(f[y]+1)%XJQ;
}
}
int main()
{
scanf("%lld",&n);
for(ll i=1;i<n;i++){
ll x,y;
scanf("%lld%lld",&x,&y);
addl(x,y);addl(y,x);
}
dp(1,0);
for(ll i=1;i<=n;i++)
(ans+=f[i])%=XJQ;
printf("%lld",ans);
}