HDU 5379 Mahjong tree
题意:在一棵有n个节点的树上放编号从1到n的麻将,要求每个点的儿子节点之间的编号连续,每棵子树内的编号连续。
解法:手推一组样例之后就可以得到如下结论然后从根节点一边讨论一边搜就好了。
当一个节点只有一个儿子的时候,如果儿子是叶子节点则只有一种放法,如果儿子不是叶子节点则有两种放法。
当一个节点有两个儿子的时候,一定有两种放法。
当一个儿子有三个儿子及以上的时候,假设有k个儿子,如果非叶子节点m的个数为0则有k!种放法,如果m为1,则有2 × (k - 1)!种放法,如果m为2,则有2 × (k - 2)!种放法,如果m > 2则不存在合法情况。
将所有情况相乘即为答案。
代码:
代码是队友写的……这么鬼畜的变量名才不是我起的呢233
哦对了……要手动扩栈不然会RE
#pragma comment(linker, "/STACK:102400000,102400000")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <set>
#include <map>
#include <vector>
#include <limits.h>
using namespace std;
typedef long long LL;
#define MAXN 100010//1e5
const LL mod = (LL)1e9 + 7;
int t, n, cas;
vector<int> edge[MAXN];
bool vis[MAXN];
LL ans;
LL A[MAXN];
void init() {
for(int i = 0; i <= n; i++) {
edge[i].clear();
}
edge[0].push_back(1);
edge[1].push_back(0);
memset(vis, false, sizeof vis);
vis[0] = true;
ans = 1LL;
}
void DFS(int u) {
int len = edge[u].size();
if((len == 1 && u != 0) || ans == 0LL) return ;
if(len - 1 == 1 || u == 0) {
for(int i = 0; i < len; i++) {
int v = edge[u][i];
if(!vis[v]) {
if(edge[v].size() - 1 > 0) {
ans = (ans * 2LL) % mod;
vis[v] = true;
if(ans == 0LL) return;
DFS(v);
}
}
}
} else if(len - 1 == 2) {
ans = (ans * 2LL) % mod;
for(int i = 0; i < len; i++) {
int v = edge[u][i];
if(vis[v]) continue;
vis[v] = true;
if(ans == 0LL) return;
DFS(v);
}
} else if(len - 1 >= 3) {
vector<int> son;
int cnt = 0;
int dayu0 = 0;
for(int i = 0; i < len; i++) {
int v = edge[u][i];
if(vis[v]) continue;
son.push_back(v);
if(edge[v].size() - 1 > 0) dayu0++;
}
cnt = son.size();
if(dayu0 == 0) {
ans = (ans * A[cnt]) % mod;
} else if(dayu0 == 1) {
ans = (ans * 2LL) % mod;
ans = (ans * A[cnt - 1]) % mod;
} else if(dayu0 == 2) {
ans = (ans * 2LL) % mod;
ans = (ans * A[cnt - 2]) % mod;
} else {
ans = 0LL; return ;
}
for(int i = 0; i < cnt; i++) {
int v = son[i];
vis[v] = true;
if(ans == 0LL) return ;
DFS(v);
}
}
}
int main() {
scanf("%d", &t);
A[1] = 1LL;
for(LL i = 2; i <= 100000LL; i++) {
A[i] = A[i - 1] * i % mod;
}
while(t--) {
scanf("%d", &n);
init();
int u, v;
for(int i = 0; i < n - 1; i++) {
scanf("%d%d", &u, &v);
edge[u].push_back(v);
edge[v].push_back(u);
}
DFS(0);
printf("Case #%d: %I64d\n", ++cas, ans);
}
return 0;
}
HDU 5379 Mahjong tree的更多相关文章
- Hdu 5379 Mahjong tree (dfs + 组合数)
题目链接: Hdu 5379 Mahjong tree 题目描述: 给出一个有n个节点的树,以节点1为根节点.问在满足兄弟节点连续 以及 子树包含节点连续 的条件下,有多少种编号方案给树上的n个点编号 ...
- HDU 5379 Mahjong tree(dfs)
题目链接:pid=5379">http://acm.hdu.edu.cn/showproblem.php? pid=5379 Problem Description Little su ...
- HDU 5379 Mahjong tree(树的遍历&组合数学)
本文纯属原创,转载请注明出处.谢谢. http://blog.csdn.net/zip_fan 题目传送门:http://acm.hdu.edu.cn/showproblem.php? pid=537 ...
- HDU 5379——Mahjong tree——————【搜索】
Mahjong tree Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tota ...
- 2015 Multi-University Training Contest 7 hdu 5379 Mahjong tree
Mahjong tree Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tota ...
- 2015多校第7场 HDU 5379 Mahjong tree 构造,DFS
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5379 题意:一颗n个节点n-1条边的树,现在要给每个节点标号(1~n),要求:(1)每一层的兄弟节点的 ...
- HDU 5379 Mahjong tree dfs+组合数学
题意:给你一棵树来分配号码,要求是兄弟节点连续并且每一棵子树连续. 思路:因为要求兄弟和子树都是连续的,所以自己打下草稿就可以发现如果一个节点有3个或3个以上的非叶子结点,那么就无论如何也不能达到目的 ...
- Mahjong tree (hdu 5379 dfs)
Mahjong tree Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Tot ...
- 【HDOJ 5379】 Mahjong tree
[HDOJ 5379] Mahjong tree 往一颗树上标号 要求同一父亲节点的节点们标号连续 同一子树的节点们标号连续 问一共同拥有几种标法 画了一画 发现标号有二叉树的感觉 初始标号1~n 根 ...
随机推荐
- ElasticSearch Java api 详解_V1.0
/×××××××××××××××××××××××××××××××××××××××××/ Author:xxx0624 HomePage:http://www.cnblogs.com/xxx0624/ ...
- Xamarin for Visual Studio 3.11.658 Alpha 版 破解补丁
注意:此版本为 Alpha 版,版本迭代较频繁,仅供尝鲜 前提概要 全新安装请参考 安装 Xamarin for Visual Studio. 最新稳定版请参考 Xamarin for Visual ...
- Git命令参考手册(转)
git init # 初始化本地git仓库(创建新仓库) git config --global user.name "xxx" # 配置用户名 git config --glob ...
- P1023 奶牛的锻炼
P1023 奶牛的锻炼 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 USACO 描述 奶牛Bessie有N分钟时间跑步,每分钟她可以跑步或者休息.若她在第 ...
- lintcode 中等题:N Queens II N皇后问题 II
题目: N皇后问题 II 根据n皇后问题,现在返回n皇后不同的解决方案的数量而不是具体的放置布局. 样例 比如n=4,存在2种解决方案 解题: 和上一题差不多,这里只是求数量,这个题目定义全局变量,递 ...
- nginx/apache/php隐藏http头部版本信息的实现方法
有时候我们需要隐藏我们的服务器版本信息,防止有心人士的研究,更安全,这里介绍下在nginx/apache/php中如何隐藏http头部版本信息的方法. nginx隐藏头部版本信息方法 编辑nginx. ...
- 利用Nginx搭建http和rtmp协议的流媒体服务器
http://www.linuxidc.com/Linux/2013-02/79118.htm
- ios开发--27个提升效率的iOS开源库推荐
超长慎入列表: DZNEmptyDataSet(UI,空表格视图解算器) PDTSimpleCalendar(UI,drop-in日历组件) MagicalRecord(实施活跃记录模式的Core D ...
- 2014-9-17二班----11 web project
http://localhost:8080/rwkj1/indexServlet?name=zhagnsan&pwd=1234 跳 转 http://localhost:8080/rwkj ...
- Tomcat 管理页面
一.配置刚下载的解压版的apache-tomcat,启动后,通过浏览器访问:http://127.0.0.1:8080/(或者http://localhost:8080)然后点击下图的Server s ...