[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的牛棚的屋顶.门被吹飞了. 好在许多牛正在度假,所以牛棚没有住满. 牛棚一个紧挨着另一个被排成一行,牛就住在里面过夜. 有些牛棚里有牛 ...
随机推荐
- Django初探(模板渲染、模板语音、simple_tag、母版子版、静态配置文件)
一.首先我们用PyCharm来创建一个Django项目 终端命令:django-admin startproject sitename 图形创建: 这样一个Django项目就创建完成了,上面可以看 ...
- 残差网络(Residual Network)
一.背景 1)梯度消失问题 我们发现很深的网络层,由于参数初始化一般更靠近0,这样在训练的过程中更新浅层网络的参数时,很容易随着网络的深入而导致梯度消失,浅层的参数无法更新. 可以看到,假设现在需要更 ...
- CRF++模板使用(转)
CRF++模板构建分为两类,一类是Unigram标注,一类是Bigram标注. Unigram和Bigram模板分别生成CRF的状态特征函数 和转移特征函数 .其中 是标签, 是观测序列, ...
- MongoDB之conf配置文件详解(五)
详细看一下mongodb配置文件. mongodb.conf # mongodb.conf # 数据库文件位置 dbpath=/var/lib/mongodb #日志文件的路径 logpath=/va ...
- 003iptables 命令介绍
http://www.cnblogs.com/wangkangluo1/archive/2012/04/19/2457072.html iptables 防火墙可以用于创建过滤(filter)与NAT ...
- Kail Linux渗透测试之测试工具Armitage
Kali Linux下的Armitage是一个很强大的渗透工具,图形化操作页面,但我们把kali linux装在虚拟机里面,然后再启动armitage就会出现一个error,他会给你一个message ...
- 字符串匹配的KMP算法(如何实现还需静下心来细看)
第一部分:KMP算法的理解(转:http://kb.cnblogs.com/page/176818/) 字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB AB ...
- HDRtools-OpenExr
转:http://blog.csdn.net/lqhbupt/article/details/7917764 OpenEXR是由工业光魔(Industrial Light& Magic)开发的 ...
- python进行des加密解密,而且可以与JAVA进行互相加密解密
import binasciifrom pyDes import des, CBC, PAD_PKCS5import uuidimport time # pip install -i https:// ...
- 小甲鱼Python笔记(上)
基于Python 3.4.3 一 二 三 四 基础 print 三版必须加括号,二版不用加 alt + n :上一条语句 alt + p :下一条语句 打印三条hello 没有大括号,用缩进来表示 ...