求树的子树数目
来源:互联网 发布:淘宝阶层 编辑:程序博客网 时间:2024/04/28 15:58
题目是srm 570 div2的1000
题意转化一下就是 给你一棵树,叫你求这颗树的子树有多少个,包括空树。
我们用f[i]来表示以节点i为根的树的数目。
首先如果只是一个节点,那么以它为根的树的数目为1.
如果以a为根的一棵树有k个儿子,那么
f[a] = (f[a1]+1)*(f[a2]+1)*(f[a3]+1)....
由此可用记忆化搜索将f[1]到f[n]全都求出来,再相加,最后再加上1,即为空时,为所求。
class CentaurCompanyDiv2 {public:long long count(vector <int>, vector <int>);};long long f[55];bool vis[55];vector <int> e[55];void dfs(int rt, int fa){ int len = e[rt].size(); if(len==0){vis[rt]=true; f[rt]=1;return;} for(int i = 0; i < len; i++) { int son = e[rt][i]; if(son!=fa) { if(!vis[rt])dfs(son, rt); f[rt]*=f[son]+1; } } vis[rt]=true;}long long CentaurCompanyDiv2::count(vector <int> a, vector <int> b) { int len = a.size(); for(int i = 0; i < 55; i++) { e[i].clear(); f[i]=1;vis[i]=false; } for(int i = 0; i < len; i++) { e[a[i]].push_back(b[i]); e[b[i]].push_back(a[i]); }long long ans = 0;dfs(1,0);for(int i = 1; i <= len+1; i++) {ans += f[i];} return ans+1;}
- 求树的子树数目
- 二叉树-求结点m所在子树中包括的结点的数目
- 树-----求叶子结点数目,结点数目,树的高度
- 求二叉树的叶子节点数目
- 求分割的数目
- 求1的数目
- 求出现频率最高的子树值
- 二叉树的子树
- 二叉树求子树Java实现
- 求二叉树中以x为值的根结点的子树的深度
- 【算法题】求二叉树所有节点的左右子树的绝对值差的和
- BC#62C题求二叉树不同节点数的子树的个数
- 求一个二叉树是否为另一个二叉树的子树
- poj 1192 求树的最大权子树(树形dp)
- hdu3887求一棵树中每个结点的子树中比其序号小的数目
- 交换二叉树的左子树和右子树
- 树结构的子树合并(不考虑子树顺序)
- 编程之美---求1的数目
- Hdu 1754 I Hate It
- 收集WTL学习资料
- errno的基本用法
- MsSQL 获得指定表的所有(数据插入脚本)
- 看懂SqlServer查询计划
- 求树的子树数目
- 利用GoogleApi根据经纬度查询地名,和根据地名查询经纬度Java代码
- 【Android数据传递】Intent传递List和Object和List<Object>(附源码)
- iOS开发中程序崩溃邮件通知代码
- 被挑拨起来的决斗改成了大便
- Codeforces Beta Round #9 (Div. 2 Only), problem: (D) How many trees? DP
- 【iOS开发】---- NSUserDefaults
- 最简单的c++文件拷贝方法
- 大话设计模式6 建造者模式 观察者模式