HDU5379
来源:互联网 发布:淘宝的淘金币怎么赚 编辑:程序博客网 时间:2024/04/29 03:02
在一棵树上给所有点标号,要求任意一个子树里的点编号连续,每一个点的儿子编号连续。 那么,一个点的非叶子儿子应该是连续的,即一个点的非叶子儿子最多只有两个,一个放在头,一个放在尾。 对于每一个点,我们把它的叶子儿子的个数记作S,所有儿子的方案数积为T。当非叶子儿子节点个数等于1的时候,方案数为2T*(S!)因为这个儿子可以放头也可以放尾,答案还要乘上2。 当非叶子儿子节点数等于2的时候,这个点为根的子树合法方案数位T*(S!). 这样dfs一遍即可以处理整棵树的方案数。
#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <algorithm>#include <queue>#include <map>#include <set>#include <vector>#include <string>#include <stack>#include <bitset>#define INF 0x3f3f3f3f#define eps 1e-8#define FI first#define SE secondusing namespace std;typedef long long LL;const int mod = 1e9 + 7;const int N = 100005;int head[N];struct Edge {int nxt, to;} ed[N * 2];int ecnt;void addedge(int u, int v) {ed[ecnt].nxt = head[u];ed[ecnt].to = v;head[u] = ecnt++;}int fac[N];//fac[i]表示i的阶乘int dp[N];//dp[i]以i为根的方法数的一半int sz[N];//sz[i]表示包括i在内的以i为根的子树的节点总个数int son[N];//son[i]第i个非叶子儿子组合方法数bool dfs(int u, int fa) {sz[u] = 1;for (int e = head[u]; ~e; e = ed[e].nxt) {int v = ed[e].to;if (v == fa) continue;if (!dfs(v, u)) return 0;sz[u] += sz[v];}int c1 = 0, c2 = 0;//c1记录非叶子儿子个数,c2记录叶子儿子个数for (int e = head[u]; ~e; e = ed[e].nxt) {int v = ed[e].to;if (v == fa) continue;if (sz[v] > 1) {son[c1++] = dp[v];}else {c2++;}}if (c1 > 2) return 0;//若有多于2个非叶子儿子则无解if (c1 == 0) {//没有非叶子儿子,则组合数为叶子儿子的排列组合dp[u] = fac[c2];}else if (c1 == 1) {//只有一个非叶子儿子,可以一个放在头,一个放在尾,所以乘以2dp[u] = 2LL * son[0] * fac[c2] % mod;}else {//有两个非叶子儿子,肯定是一个放在头,一个放在尾,两者可以交换,所以乘以2dp[u] = 2LL * son[0] * son[1] % mod * fac[c2] % mod;}return 1;}int main() {fac[0] = 1;for (int i = 1; i < N; ++i) {fac[i] = (LL)fac[i - 1] * i % mod;}int T;scanf("%d", &T);for (int cas = 1; cas <= T; ++cas) {int n;scanf("%d", &n);memset(head, -1, (n + 3) * sizeof(int));ecnt = 0;for (int u, v, i = 1; i < n; ++i) {scanf("%d%d", &u, &v);addedge(u, v);addedge(v, u);}printf("Case #%d: ", cas);if (n == 1) {puts("1");continue;}if (dfs(1, 0)) {printf("%d\n", dp[1] * 2 % mod);//根有两种选择,分别是放头和尾,所以乘以2}else {puts("0");}}return 0;}
0 0
- HDU5379
- hdu5379 dfs+排列组合
- 【HDU5379】【Mahjong tree】
- HDU5379.Mahjong tree
- hdu5379(树形dp)
- hdu5379(树形dp)
- 树形dp--hdu5379
- hdu5379 Mahjong tree 树形DP
- hdu5379 Mahjong tree DFS 多校联合第七场
- hdu5379(2015多校7)--Mahjong tree(构造+dfs)
- hdu5379||2015多校联合第7场1011 树形统计
- 0x3f3f3f3f...编程中无穷大常量的设置技巧
- xmanager xshell 注册码
- ASP.NET网站管理工具的初始配置
- 伸展树及从上而下的伸展树
- 【数据结构】之队列的java实现(一)
- HDU5379
- iOS QQ第三方登录 提示所安装的QQ不是最新版本的问题
- HDU 5249 KPI(treap 树堆 )
- Oracle 11G在用EXP 导出时,空表不能导出解决
- UIRefreshControl用法
- 开发实战练习1 jsp+jdbc 登陆程序
- easyui中combobox级联的实现
- ColorPicker 在sublime中的快捷键不可用(ctrl+shift+c)
- STM32的时钟基础知识