一棵树的子树数量

编程入门 行业动态 更新时间:2024-10-11 21:30:47

一棵树的<a href=https://www.elefans.com/category/jswz/34/1664832.html style=子树数量"/>

一棵树的子树数量

原题:Who killed Cock Robin

题意

给出一颗无根树,问有多少种子图(包括点)

解析

既然无根树,那么就随便选择一个点为rt,就1好了

用x[i]表示以i点为父亲得到的图的可能性
对于每个点i,儿子数为0时,x[i]为0,有n个儿子时,对于每个儿子j所能产生的可能性为x[j]+1,而x[i]为随便选任意个儿子相乘之和

eg:有三个儿子可能性为2 3 4,可能得到的就是3 4 5
那么x[i]=3+4+5+3*4+4*5+3*5+3*4*5

任意乘有个公式:dp[i]=dp[i-1]*x[i]+x[i] (dp[i]为前i个数的任意乘)
因为3和4有3,4,3*4,加入5多了5,3*5,4*5,3*4*5,多了的部分就是5*前面部分加一个5

另外,x[儿子]和x[父亲]都要加到ans里面,因为以父亲为root的那部分是从父亲开始往下延的,而x[儿子]是以儿子为root的

代码

#define N 100009
int n;
vector<int>v[2*N];
D Ans=0;D fin(int ar,int fa){int haveson=0;queue<D>Q;for(int i=0;i<v[ar].size();i++){if(v[ar][i]==fa)continue;D add=fin(v[ar][i],ar)+1;Q.push(add);}D ans=0;while(!Q.empty()){ans+=ans*Q.front()%mod;ans=(ans+Q.front())%mod;Q.pop();}Ans=(Ans+ans)%mod;return ans;
}int main(){cin>>n;Ans+=n;for(int i=1;i<=n-1;i++){int a,b;scanf("%d%d",&a,&b);v[a].push_back(b);v[b].push_back(a);}fin(1,0);printf("%lld\n",Ans);
}

更多推荐

一棵树的子树数量

本文发布于:2023-06-26 04:20:45,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/889196.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:子树   一棵树   数量

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!