本文纯属原创,转载请注明出处。谢谢。

http://blog.csdn.net/zip_fan

Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)

Problem Description
Little sun is an artist. Today he is playing mahjong alone. He suddenly feels that the tree in the yard doesn't look good. So he wants to decorate the tree.(The tree has n vertexs, indexed from 1 to n.)
Thought for a long time, finally he decides to use the mahjong to decorate the tree.
His mahjong is strange because all of the mahjong tiles had a distinct index.(Little sun has only n mahjong tiles, and the mahjong tiles indexed from 1 to n.)
He put the mahjong tiles on the vertexs of the tree.
As is known to all, little sun is an artist. So he want to decorate the tree as beautiful as possible.
His decoration rules are as follows: (1)Place exact one mahjong tile on each vertex.
(2)The mahjong tiles' index must be continues which are placed on the son vertexs of a vertex.
(3)The mahjong tiles' index must be continues which are placed on the vertexs of any subtrees. Now he want to know that he can obtain how many different beautiful mahjong tree using these rules, because of the answer can be very large, you need output the answer modulo 1e9 + 7.
 
Input
The first line of the input is a single integer T, indicates the number of test cases.
For each test case, the first line contains an integers n. (1 <= n <= 100000)
And the next n - 1 lines, each line contains two integers ui and vi, which describes an edge of the tree, and vertex 1 is the root of the tree.
 
Output
For each test case, output one line. The output format is "Case #x: ans"(without quotes), x is the case number, starting from 1.
 
Sample Input
2
9
2 1
3 1
4 3
5 3
6 2
7 4
8 7
9 3
8
2 1
3 1
4 3
5 1
6 4
7 5
8 4
 
Sample Output
Case #1: 32
Case #2: 16
 


题意:在一颗树上有n个节点,如今要把他们进行1-n编号。

要保证1、兄弟节点之间号是连续的,2、每棵子树号自身是连续的,求一共同拥有多少种可能。


事实上很easy,首先兄弟节点之间号是连续的,并且子树号是连续的,那么互为兄弟节点的那些点中。至多有2个节点有儿子节点,否则不可能满足上述条件。
仅仅要明确了这一点,直接遍历树。统计就可以。

可是题目有一个很大的神坑点:给边的时候是任意的,所以必须先双向建图。然后从根节点開始遍历一遍,把多余的边删掉。(比赛的时候被坑了好久)
当然hdu的栈深度就不吐槽了,手动开栈。c++提交。

以下上代码。
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <map>
#include <queue>
#include <vector>
#include <iostream>
#include <algorithm>
#define moo 1000000007//10^9+7
#define PI acos(-1.0)
#define eps 1e-5
#pragma comment (linker,"/STACK:102400000,102400000")
using namespace std;
long long jie[100000+100];//存阶乘。即全排列情况
vector<int>tre[100000+100];//存点i能到的点,相当于邻接表建图。
int vis[100000+100];//存第i个点的訪问情况
void init()
{
jie[0]=1;
for(int i=1;i<=100000;i++)
{
jie[i]=jie[i-1]*i;
jie[i]%=moo;
}
}//n个无子节点的兄弟节点能够有n!种排列
void dfs1(int num)//先遍历一遍树,将多余的边删除
{
vis[num]=1;
int nn=tre[num].size();
int now=0;
while(now<nn)
{
if(vis[tre[num][now]]==1)
{
tre[num].erase(tre[num].begin()+now);
nn--;
continue;
}
dfs1(tre[num][now]);
now++;
}
}
long long dfs(int num,int has)//统计num节点的情况,has代表num是否有兄弟节点
{
if(tre[num].size()==0)//假设num没有子节点,直接return 1。表示仅仅有1种排列情况
return 1;
long long ans=1;
int num1=0;//存num点的子节点中无子节点的节点个数
int num2=0;//存num点的子节点中有子节点的节点个数
int nn=tre[num].size();
for(int i=0;i<nn;i++)
{
if(tre[tre[num][i]].size()==0)
num1++;
else
num2++;
}
if(num2>2)
return 0;//假设有超过2个点有子节点。那么一定无法满足条件。return 0
if(has==0)//假设num点没有兄弟节点,那么num点能够在子节点的最左或者最右,即2种选择
ans*=2;
ans*=jie[num1];//num的子节点中无子节点的节点能够组成全排列
ans%=moo;
if(num2==0)//假设没有有子节点的节点。那么该点统计完成
return ans;
if(tre[num].size()!=1)//假设不止有一个有子节点的子节点。那么该子节点能够在最左或最右
ans*=2;
int go;
if(tre[num].size()==1)//推断其子节点是否有兄弟节点,为其子节点的统计做准备
go=0;
else
go=1;
for(int i=0;i<nn;i++)
{
if(tre[tre[num][i]].size()!=0)
{
long long la=ans;
ans*=dfs(tre[num][i],go);//假设该点有子节点,继续统计
ans%=moo;
}
}
return ans%moo;
}
int main()
{
int T;
cin>>T;
int dd=T;
init();
while(T--)
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
tre[i].clear();
memset(vis,0,sizeof(vis));
for(int i=1;i<=n-1;i++)
{
int x,y;
scanf("%d%d",&x,&y);
tre[y].push_back(x);
tre[x].push_back(y);
}
dfs1(1);
printf("Case #%d: %I64d\n",dd-T,dfs(1,0));
}
return 0;
}

HDU 5379 Mahjong tree(树的遍历&amp;组合数学)的更多相关文章

  1. Hdu 5379 Mahjong tree (dfs + 组合数)

    题目链接: Hdu 5379 Mahjong tree 题目描述: 给出一个有n个节点的树,以节点1为根节点.问在满足兄弟节点连续 以及 子树包含节点连续 的条件下,有多少种编号方案给树上的n个点编号 ...

  2. HDU 5379 Mahjong tree(dfs)

    题目链接:pid=5379">http://acm.hdu.edu.cn/showproblem.php? pid=5379 Problem Description Little su ...

  3. HDU 5379——Mahjong tree——————【搜索】

    Mahjong tree Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

  4. 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 ...

  5. 2015多校第7场 HDU 5379 Mahjong tree 构造,DFS

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5379 题意:一颗n个节点n-1条边的树,现在要给每个节点标号(1~n),要求:(1)每一层的兄弟节点的 ...

  6. HDU 5379 Mahjong tree dfs+组合数学

    题意:给你一棵树来分配号码,要求是兄弟节点连续并且每一棵子树连续. 思路:因为要求兄弟和子树都是连续的,所以自己打下草稿就可以发现如果一个节点有3个或3个以上的非叶子结点,那么就无论如何也不能达到目的 ...

  7. HDU 5379 Mahjong tree

    题意:在一棵有n个节点的树上放编号从1到n的麻将,要求每个点的儿子节点之间的编号连续,每棵子树内的编号连续. 解法:手推一组样例之后就可以得到如下结论然后从根节点一边讨论一边搜就好了. 当一个节点只有 ...

  8. HDU 3333 - Turing Tree (树状数组+离线处理+哈希+贪心)

    题意:给一个数组,每次查询输出区间内不重复数字的和. 这是3xian教主的题. 用前缀和的思想可以轻易求得区间的和,但是对于重复数字这点很难处理.在线很难下手,考虑离线处理. 将所有查询区间从右端点由 ...

  9. hdu 1710 Binary Tree Traversals 前序遍历和中序推后序

    题链;http://acm.hdu.edu.cn/showproblem.php?pid=1710 Binary Tree Traversals Time Limit: 1000/1000 MS (J ...

随机推荐

  1. 【转载】SQL Server XML Path

    FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作.那么以一个实例为主 ...

  2. 洛谷——1968 美元汇率(DP)

    题目背景 此处省略maxint+1个数 题目描述 在以后的若干天里戴维将学习美元与德国马克的汇率.编写程序帮助戴维何时应买或卖马克或美元,使他从100美元开始,最后能获得最高可能的价值. 输入输出格式 ...

  3. 立即执行函数(IIFE)

    立即执行函数(IIFE) 看到这里,相信你一定迫不及待地想知道究竟如何做了吧,其实很简单,只需要用括号全部括起来即可,比如下面这样: (function(){ /* code */ }()); 为什么 ...

  4. OpenSSL使用2(SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12概念说明)(转)

    SSL SSL - Secure Sockets Layer,现在应该叫"TLS",但由于习惯问题,我们还是叫"SSL"比较多.http协议默认情况下是不加密内 ...

  5. XCode删除多余的Simulator(模拟器)

    每个xocde都会自带一个模拟器,且都是随安装包一起打包的,比如xcode8.0的就自带iOS10的模拟器,这个是没办法删除. 但是对于想要用iOS10以前的模拟器,可以通过这里进行下载: 最终下载的 ...

  6. iOS博客列表

    国外 iOSDevWeekly NSHipster NSBlog objcio Raywenderlich Bignerdranch NSScreencast 需FQ Pilky.me jeremyw ...

  7. quick-coco2d下的事件

    qucik下的事件机制很简洁,也很简单,能够处理大多数的自定义时间,我们新建一个类型,然后用扩展的方式实现事件,之前quick的文档上很详细,但是很悲哀,傻逼的的网站现在是404,记下来,怕到时候忘记 ...

  8. Zookeeper协调分布式节点demo

    多台服务器和客户端通过第三方组件Zookeeper管理 public class DistributedServer { private static final String connectStri ...

  9. vue2.0中怎么获取元素

    在元素上添加 v-el:food-wrapper (不用驼峰的写法) vue1版本 报错: vue2版本 (vue2把vue1中的 v-el 改为了 ref vue1 v-el:foods-wrapp ...

  10. Linux学习之十三-vi和vim编辑器及其快捷键

    vi和vim编辑器及其快捷键 1.vi与vim区别 它们都是多模式编辑器,不同的是vim 是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面. vim的这些优势主要体现在以下几个方 ...