[SimpleOJ236]暴风雨
题目大意:
给你一棵n个点的树,以及m+q条信息。
m条描述点a到b有边直接相连。
q条描述点a和点b的LCA为c。
问有多少符合条件的以1为根的树。
思路:
状压DP。
e[i]记录需要与点i直接相连的点。
sub[i]记录需要在点i子树中的点。
pair[i]记录在点i不同子树下的点对(x,y),即满足lca(x,y)=i。
f[i][j][k]表示以i为根的子树,处理完j个点,子树状压以后的状态为k。
接下来枚举子树j的状态i和子树l的状态k,其中l是j的孩子。
然后每次转移判断一下是否满足m+q个条件。
#include<cstdio>
#include<cctype>
#include<vector>
#include<cstring>
typedef long long int64;
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
const int N=;
int e[N];//e[i]记录需要与点i直接相连的点
int sub[N];//sub[i]记录需要在点i子树中的点
std::vector<int> pair[N];//pair[i]记录在点i不同子树下的点对(x,y),即满足lca(x,y)=i
int64 f[N+][N+][<<N];//f[i][j][k]表示以i为根的子树,处理完j个点,子树状压以后的状态为k
inline void init() {
memset(e,,sizeof e);
memset(f,,sizeof f);
memset(sub,,sizeof sub);
for(register int i=;i<N;i++) {
f[i][][<<i]=;
pair[i].clear();
}
}
int main() {
for(register int T=getint();T;T--) {
init();
const int n=getint(),m=getint(),q=getint();
for(register int i=;i<m;i++) {
const int x=getint()-,y=getint()-;
e[x]|=<<y;
e[y]|=<<x;
}
for(register int i=;i<q;i++) {
const int x=getint()-,y=getint()-,lca=getint()-;
pair[lca].push_back((<<x)|(<<y));
sub[lca]|=(<<x)|(<<y);
}
for(register int i=;i<(<<n);i++) {//枚举j子树的状态
for(register int j=;j<n;j++) {//枚举j子树
if(!(i&(<<j))) continue;//j的子树不包括j显然是不可能的
if(j&&(i&)) continue;//1不可能出现在别的子树中
for(register int k=i^(<<j);k;k=(k-)&(i^(<<j))) {//枚举l子树的状态
for(register unsigned i=;i<pair[j].size();i++) {//枚举j子树中不能在同一棵子树中的点对
if((k&pair[j][i])==pair[j][i]) goto Next;//也就是说肯定不能都出现在l的子树中吧
}
for(register int l=;l<n;l++) {//枚举l子树(l是j的一个孩子)
if(!(k&(<<l))) continue;//l的子树不包括l显然是不可能的
if((k^(<<l))&e[j]) continue;//与j相连的点不可能出现在l的子树中(除了l本身)
if((e[l]&(k|(<<j)))!=e[l]) continue;//必须与l相连的点(要么是l孩子,要么是j)没有与l相连
if((sub[l]&k)!=sub[l]) continue;//必须出现在l子树中的点都在子树中
f[j][l+][i]+=f[j][l][i-k]*f[l][n][k];
}
Next:;
}
for(register int k=;k<n;k++) {
f[j][k+][i]+=f[j][k][i];
}
}
}
printf("%lld\n",f[][n][(<<n)-]);
}
return ;
}
[SimpleOJ236]暴风雨的更多相关文章
- bzoj1067 降雨量&&vijos1265 暴风雨
描述 话说这日,李逍遥与阿奴正欲前往桃花源拿寿葫芦,突然电闪雷鸣,天降暴雨,弄得两人措手不及,只得到附近的树洞避雨. "哎,大理不是本应旱灾的吗?怎么会突降暴雨呢?"李逍遥嘀咕道. ...
- Storm
2016-11-14 22:05:29 有哪些典型的Storm应用案例? 数据处理流:Storm可以用来处理源源不断流进来的消息,处理之后将结果写入到某个存储中去.不像其它的流处理系统,Storm不 ...
- 周末惊魂:因struts2 016 017 019漏洞被入侵,修复。
入侵(暴风雨前的宁静) 下午阳光甚好,想趁着安静的周末静下心来写写代码.刚过一个小时,3点左右,客服MM找我,告知客户都在说平台登录不了(我们有专门的客户qq群).看了下数据库连接数,正常.登录阿里云 ...
- 微信双开是定时炸弹?关于非越狱iOS上微信分身高危插件ImgNaix的分析
作者:蒸米@阿里移动安全 序言 微信作为手机上的第一大应用,有着上亿的用户.并且很多人都不只拥有一个微信帐号,有的微信账号是用于商业的,有的是用于私人的.可惜的是官方版的微信并不支持多开的功能,并且频 ...
- Windows10 会不会成为微软的新起点?
Because if you change the way you see the world, you can change the world you see. 如果你改变看世界的方式,你就能改变 ...
- jekyll安装的斗智斗勇
jekyll---将纯文本转化为静态网站和博客,GitHub Pages 可以运行 Jekyll,你很简单就可以完全免费的在 GitHub 上发布网站. 小白安装jekyll时的若干问题,有错误欢迎指 ...
- 备战NOIP每周写题记录(一)···不间断更新
※Recorded By ksq2013 //其实这段时间写的题远远大于这篇博文中的内容,只不过那些数以百记的基础题目实在没必要写在blog上; ※week one 2016.7.18 Monday ...
- 洛谷P2242 公路维修问题(Road)
题目描述 在一个夜黑风高,下着暴风雨的夜晚,farmer John的牛棚的屋顶.门被吹飞了. 好在许多牛正在度假,所以牛棚没有住满. 牛棚一个紧挨着另一个被排成一行,牛就住在里面过夜. 有些牛棚里有牛 ...
- 洛谷P1209 [USACO1.3]修理牛棚 Barn Repair
题目描述 在一个夜黑风高,下着暴风雨的夜晚,farmer John的牛棚的屋顶.门被吹飞了. 好在许多牛正在度假,所以牛棚没有住满. 牛棚一个紧挨着另一个被排成一行,牛就住在里面过夜. 有些牛棚里有牛 ...
随机推荐
- 51Nod - 1006 最长公共子序列Lcs模板
给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdkscab ab是两个串的子序列,abc也是,abca也是,其中abca是这 ...
- python初步学习-面向对象之类(一)
python 面向对象 python 从设计之初就已经是一门面向对象的语言,正因为如此,在python中创建一个类和对象是很容易的. 对象对象奇数简介 类(Class): 用于描述具有相同的属性和方法 ...
- javac -cp java -cp
///////////////////////////////////////////////////////////////////////////////////// 编译java文件的命令都知道 ...
- atoll()函数使用注意事项及分析
atoll是c99标准加入的函数,在编译的时候可能要打开C99标准的编译选项 -std=c99. 另外,必须包含stdlib.h头文件,否则会出错. ☞ C程序代码如下所示: #include < ...
- Deep Learning基础--word2vec 中的数学原理详解
word2vec 是 Google 于 2013 年开源推出的一个用于获取 word vector 的工具包,它简单.高效,因此引起了很多人的关注.由于 word2vec 的作者 Tomas Miko ...
- HDU 6195 2017沈阳网络赛 公式
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6195 题意:有M个格子,有K个物品.我们希望在格子与物品之间连数量尽可能少的边,使得——不论是选出M个 ...
- MySQL之查漏补缺
1.TRUNCATE语句和DELETE语句的区别 1.delete语句,是DML语句,truncate语句通常被认为是DDL语句. 2.delete语句,后面可以跟where子句,通常指定where子 ...
- csu 1801(合数分解+排列组合)
1801: Mr. S’s Romance Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 15 Solved: 5[Submit][Status][W ...
- STL中stack/queue/map以及Boost unordered_map 的使用方法
一.stackstack 模板类的定义在<stack>头文件中.stack 模板类需要两个模板参数,一个是元素类型,一个容器类型,但只有元素类型是必要的,在不指定容器类型时,默认的容器类型 ...
- 用WP SMTP插件实现邮件发送功能
WordPress本身是采用mail()函数发邮件的,但是这样发出的邮件很容易被放入垃圾箱,很多主机商(特别是Windows主机)为了避免用户滥发邮件直接禁用了mail()函数,还有些云计算平台(比如 ...