HDU 5379 树形DP Mahjong tree
2015-08-14 14:28
211 查看
任意一棵子树上节点的编号连续,每个节点的所有二字节点连续,求编号方案的总数。
稍微分析一下可知
每个节点的非叶子节点个数不能多于两个,否则这个子树无解,从而整棵树都无解。
每棵子树将所有节点按照编号从小到大排序,根节点要么在最左端,要么在最右端,而且这两种情况相等。(后面会有具体分析)
设size(u)表示以节点u为根的子树中节点总数。
d(u)表示用1 ~ size(u)给以u为根的子树编号的合法方案数,考虑下面几种情况:
①: u是叶子节点,方案数为1.
②: u的所有儿子节点都是叶子节点,那么所有儿子节点连续(假设儿子节点有S个),u只能放在所有儿子节点的前面或者最后面。所以方案数就是2(S!),因为儿子节点之间互不影响可以任意排列。
③: u只有一个非叶儿子节点v。
代码君
稍微分析一下可知
每个节点的非叶子节点个数不能多于两个,否则这个子树无解,从而整棵树都无解。
每棵子树将所有节点按照编号从小到大排序,根节点要么在最左端,要么在最右端,而且这两种情况相等。(后面会有具体分析)
设size(u)表示以节点u为根的子树中节点总数。
d(u)表示用1 ~ size(u)给以u为根的子树编号的合法方案数,考虑下面几种情况:
①: u是叶子节点,方案数为1.
②: u的所有儿子节点都是叶子节点,那么所有儿子节点连续(假设儿子节点有S个),u只能放在所有儿子节点的前面或者最后面。所以方案数就是2(S!),因为儿子节点之间互不影响可以任意排列。
③: u只有一个非叶儿子节点v。
#pragma comment(linker, "/STACK:102400000,102400000") #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <vector> using namespace std; typedef long long LL; const int maxn = 100000 + 10; const LL MOD = 1000000007; vector<int> G[maxn]; int sz[maxn]; LL d[maxn], fac[maxn]; void dfs(int u, int fa) { sz[u] = 1; LL T = 1; int c1 = 0, c2 = 0; for(int i = 0; i < G[u].size(); i++) { int v = G[u][i]; if(v == fa) continue; dfs(v, u); sz[u] += sz[v]; if(d[v] == 0) { d[u] = 0; return ; } if(sz[v] > 1) { c1++; T = (T * d[v]) % MOD; } else c2++; if(c1 > 2) { d[u] = 0; return ; } } if(sz[u] == 1) { d[u] = 1; return ; } if(c1 < 2) d[u] = (2LL * fac[c2] * T) % MOD; else d[u] = (fac[c2] * T) % MOD; } int main() { fac[0] = 1; for(int i = 1; i < maxn; i++) fac[i] = (fac[i - 1] * i) % MOD; int T; scanf("%d", &T); for(int kase = 1; kase <= T; kase++) { int n; scanf("%d", &n); for(int i = 1; i <= n; i++) G[i].clear(); for(int i = 1; i < n; i++) { int u, v; scanf("%d%d", &u, &v); G[u].push_back(v); G[v].push_back(u); } printf("Case #%d: ", kase); if(n == 1) { puts("1"); continue; } dfs(1, 0); printf("%I64d\n", d[1]); } return 0; }
代码君
相关文章推荐
- 今天,我写下了我的第一篇博文。
- 教你如何使用WatchKit创建可选列表App
- php的数据类型和变量的作用域
- hdoj 4857 逃生 【拓扑排序 输出字典序最小解】
- 用IDM下载SAP软件,享受风一样的极速下载!
- Byte|Stream|String测试操作
- [ActionScript 3.0] AS3实现3D旋转
- eck add form
- ajax动态加载下拉框、单选框、复选框
- win7引导界面是英文,怎么改成中文?
- 统一项目中编码风格(Eclipse Java code format、codetemplate)
- 累了就会(ˇˍˇ) 想~爸爸想妈妈
- 通道的拆分与合并
- 让cocos2dx支持并通过arm64 编译
- 黑马程序员——java复习总结——其他类和IO流
- Apple-Watch开发1
- .NET: WPF DependencyProperty
- iTunes 12恢复.ipsw固件
- win10任务栏没反应显示黑色的长条该怎么办?
- Nginx安装详解