博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【HDOJ 5379】 Mahjong tree
阅读量:5892 次
发布时间:2019-06-19

本文共 1230 字,大约阅读时间需要 4 分钟。

往一颗树上标号 要求同一父亲节点的节点们标号连续 同一子树的节点们标号连续 问一共同拥有几种标法

画了一画 发现标号有二叉树的感觉

初始标号1~n 根结点1能够标1或n 否则其它情况无法让以下的子树满足各自连续而且该根的儿子节点都要连续
根结点下的节点平分其它标号 画一画能够发现 每一个根下最多有两颗子树 否则无法满足条件 而且两颗子树占领剩余标号的左右两边 中间夹的必须是叶子 这样才干满足该根下的儿子节点标号连续
若根下仅仅有一颗子树 相同能够选择占剩余标号左部分/右部分
剩余叶子全排列乘上就可以 每一个根都这样遍历一遍 假设期间出现一个根下有两颗以上的子树 就没法标号 即方案数为0 否则遍历完输出方案数就可以

代码例如以下:

#include 
#include
#include
#include
#include
#include
#define ll long long#define MOD 1000000007using namespace std;ll a[100010]={ 1,1,2};//A(n,n)排列组合int n;vector
s[100010];bool vis[100010];ll bfs(){ memset(vis,0,sizeof(vis)); queue
q; q.push(1); vis[1] = 1; ll ans = 2; int i,u,v,yz,gen,sz; while(!q.empty()) { u = q.front(); q.pop(); yz = gen = 0; sz = s[u].size(); for(i = 0; i < sz; ++i) { v = s[u][i]; if(vis[v]) continue; if(s[v].size() == 1)//当前节点为叶子节点(仅仅有v-u一条边) { yz++; } else//为根结点 { gen++; q.push(v); } vis[v] = 1; } if(gen > 2) return 0;//根结点超2 无解 else if(gen) { ans = ((ans*2)%MOD*a[yz])%MOD; } else ans = (ans*a[yz])%MOD; } return ans;}int main(){ for(int i=3;i<=100001;i++) a[i]=(a[i-1]*i)%MOD; int t,k=0; scanf("%d",&t); while(k++,t--) { scanf("%d",&n); memset(s,0,sizeof(s)); int u,v; for(int i=1;i

转载地址:http://hqnsx.baihongyu.com/

你可能感兴趣的文章
nagios搭建(五):nagios监控mysql
查看>>
AIX ftp 530 User root access denied
查看>>
【Java记录】try-with-resources的一个坑
查看>>
如何学习Linux命令-初级篇
查看>>
从Oracle Public Yum为Oracle Linux建立本地的Yum源
查看>>
Android开发——09Google I/O之让Android UI性能更高效(1)
查看>>
在 SELECT 查询中使用表表达式
查看>>
(二) php if语句,switch语句,continue语句,return语句,for 、while、do while 循环
查看>>
edx 获取当前request
查看>>
安卓中如何实现滑动导航
查看>>
Java-金额小数转换成中文大写金额
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
squid.3.2故障整理
查看>>
Ansible Tower安装配置全过程(上)
查看>>
地址与引用
查看>>
十大开源ERP点评 献给深水区的中小企业和CIO们
查看>>
【PHP】创蓝253云通信平台国际短信接口调用demo案例
查看>>
Confluence 6 重要缓存和监控
查看>>
Day 30 shell 编程
查看>>