题目链接:

  Hdu 5379 Mahjong tree

题目描述:

  给出一个有n个节点的树,以节点1为根节点。问在满足兄弟节点连续 以及 子树包含节点连续 的条件下,有多少种编号方案给树上的n个点编号?

解题思路:

  对于一个节点来讲,非叶子儿子节点最多有两个才能满足要求,否则满足子树节点连续的话就无法满足兄弟节点连续。然后有dfs计算每棵子树的贡献值,每棵子树的子节点可以分为叶子节点X和非叶子节点Y,叶子节点可以分配到一组连续的编号,非叶子节点只能分配到兄弟节点中最大或者最小编号两种情况,叶子节点的贡献值为X!。然后dfs跑一下就ok咯。

 #include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#pragma comment (linker, "/STACK:1024000000,1024000000")
using namespace std; const int maxn = ;
const int mod = (1e9 + );
typedef long long LL;
struct node
{
int to, next;
}edge[maxn*];
int head[][maxn], vis[maxn], tot, flag;
LL res; void Add (int from, int to)
{
edge[tot].to = to;
edge[tot].next = head[][from];
head[][from] = tot ++;
head[][from] ++;
} void dfs (int u)
{
int k, cnt;
k = cnt = ;
vis[u] = ;
for (int i=head[][u]; i!=-; i=edge[i].next)
{ int v = edge[i].to;
if (vis[v])
continue;
if (!vis[v] && head[][v]==)
cnt ++;
else
dfs (v);
k ++;
}
if (k - cnt > )
{
res = ;
return;
}
if (k != cnt)
res = (res * ) % mod;
while (cnt)
{
res = (res * cnt) % mod;
cnt --;
}
}
int main ()
{
int t, n, l = ;
scanf ("%d", &t); while (t --)
{
scanf ("%d", &n);
memset (head[], -, sizeof(head[]));
memset (head[], , sizeof(head[]));
memset (vis, , sizeof(vis));
tot = flag = ; for (int i=; i<n; i++)
{
int u, v;
scanf ("%d %d", &u, &v);
Add (u, v);
Add (v, u);
}
res = ;
dfs ();
printf ("Case #%d: %lld\n", ++l, n==?:res);
}
return ;
}

最新文章

  1. [书目20160624]Android应用开发从入门到精通
  2. Android成长日记-Fragment的生命周期与Activity通信
  3. Linux内核中大小端判定宏
  4. iOS runloop 资源汇总-b
  5. C++学习(五)
  6. OpenCV(2)-Mat数据结构及访问Mat中像素
  7. 数据结构《17》---- 自己主动补齐之《二》----Ternary Search Tree
  8. 在CentOS下安装crontab服务
  9. 原生js触碰到底部触发函数;
  10. Haproxy官方文档翻译(第三章)全局参数(1) 附英文原文
  11. cookie和session的区别及在Django中应用
  12. Y7000安装驱动显卡问题
  13. 【XSY2472】string KMP 期望DP
  14. Swift Write to file 到电脑桌面
  15. yii2快速導出phpexcel
  16. sxstrace启动.bat
  17. 11g新特性 -- Virtual Private Catalogs
  18. Oracle查询行对应block_id,file_id
  19. sql server的缺陷 将截断字符串或二进制数据 哪个字段
  20. TypeScript开发环境搭建(Visual studio code)

热门文章

  1. cmd的操作命令导出导入.dmp文件
  2. pycharm查看代码注释的方法,代码编写日志及作者信息等
  3. Spring4.0MVC学习资料,注解自己主动扫描bean,自己主动注入bean(二)
  4. mysql查看所有存储过程,函数,视图,触发器,表,分页
  5. Linux下kill命令的学习,(主要根据man手册进行的翻译)
  6. ImageViewCoverflow
  7. Qt学习--初学注意事项
  8. Java基础面试:集合、内部类、线程
  9. 我的kindle书单
  10. mouseout和mouseover、mouseenter和mouseleave