题目大意:
  给你一棵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]暴风雨的更多相关文章

  1. bzoj1067 降雨量&&vijos1265 暴风雨

    描述 话说这日,李逍遥与阿奴正欲前往桃花源拿寿葫芦,突然电闪雷鸣,天降暴雨,弄得两人措手不及,只得到附近的树洞避雨. "哎,大理不是本应旱灾的吗?怎么会突降暴雨呢?"李逍遥嘀咕道. ...

  2. Storm

    2016-11-14  22:05:29 有哪些典型的Storm应用案例? 数据处理流:Storm可以用来处理源源不断流进来的消息,处理之后将结果写入到某个存储中去.不像其它的流处理系统,Storm不 ...

  3. 周末惊魂:因struts2 016 017 019漏洞被入侵,修复。

    入侵(暴风雨前的宁静) 下午阳光甚好,想趁着安静的周末静下心来写写代码.刚过一个小时,3点左右,客服MM找我,告知客户都在说平台登录不了(我们有专门的客户qq群).看了下数据库连接数,正常.登录阿里云 ...

  4. 微信双开是定时炸弹?关于非越狱iOS上微信分身高危插件ImgNaix的分析

    作者:蒸米@阿里移动安全 序言 微信作为手机上的第一大应用,有着上亿的用户.并且很多人都不只拥有一个微信帐号,有的微信账号是用于商业的,有的是用于私人的.可惜的是官方版的微信并不支持多开的功能,并且频 ...

  5. Windows10 会不会成为微软的新起点?

    Because if you change the way you see the world, you can change the world you see. 如果你改变看世界的方式,你就能改变 ...

  6. jekyll安装的斗智斗勇

    jekyll---将纯文本转化为静态网站和博客,GitHub Pages 可以运行 Jekyll,你很简单就可以完全免费的在 GitHub 上发布网站. 小白安装jekyll时的若干问题,有错误欢迎指 ...

  7. 备战NOIP每周写题记录(一)···不间断更新

    ※Recorded By ksq2013 //其实这段时间写的题远远大于这篇博文中的内容,只不过那些数以百记的基础题目实在没必要写在blog上; ※week one 2016.7.18 Monday ...

  8. 洛谷P2242 公路维修问题(Road)

    题目描述 在一个夜黑风高,下着暴风雨的夜晚,farmer John的牛棚的屋顶.门被吹飞了. 好在许多牛正在度假,所以牛棚没有住满. 牛棚一个紧挨着另一个被排成一行,牛就住在里面过夜. 有些牛棚里有牛 ...

  9. 洛谷P1209 [USACO1.3]修理牛棚 Barn Repair

    题目描述 在一个夜黑风高,下着暴风雨的夜晚,farmer John的牛棚的屋顶.门被吹飞了. 好在许多牛正在度假,所以牛棚没有住满. 牛棚一个紧挨着另一个被排成一行,牛就住在里面过夜. 有些牛棚里有牛 ...

随机推荐

  1. 51Nod - 1006 最长公共子序列Lcs模板

    给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的).   比如两个串为:   abcicba abdkscab   ab是两个串的子序列,abc也是,abca也是,其中abca是这 ...

  2. python初步学习-面向对象之类(一)

    python 面向对象 python 从设计之初就已经是一门面向对象的语言,正因为如此,在python中创建一个类和对象是很容易的. 对象对象奇数简介 类(Class): 用于描述具有相同的属性和方法 ...

  3. javac -cp java -cp

    ///////////////////////////////////////////////////////////////////////////////////// 编译java文件的命令都知道 ...

  4. atoll()函数使用注意事项及分析

    atoll是c99标准加入的函数,在编译的时候可能要打开C99标准的编译选项 -std=c99. 另外,必须包含stdlib.h头文件,否则会出错. ☞ C程序代码如下所示: #include < ...

  5. Deep Learning基础--word2vec 中的数学原理详解

    word2vec 是 Google 于 2013 年开源推出的一个用于获取 word vector 的工具包,它简单.高效,因此引起了很多人的关注.由于 word2vec 的作者 Tomas Miko ...

  6. HDU 6195 2017沈阳网络赛 公式

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6195 题意:有M个格子,有K个物品.我们希望在格子与物品之间连数量尽可能少的边,使得——不论是选出M个 ...

  7. MySQL之查漏补缺

    1.TRUNCATE语句和DELETE语句的区别 1.delete语句,是DML语句,truncate语句通常被认为是DDL语句. 2.delete语句,后面可以跟where子句,通常指定where子 ...

  8. csu 1801(合数分解+排列组合)

    1801: Mr. S’s Romance Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 15  Solved: 5[Submit][Status][W ...

  9. STL中stack/queue/map以及Boost unordered_map 的使用方法

    一.stackstack 模板类的定义在<stack>头文件中.stack 模板类需要两个模板参数,一个是元素类型,一个容器类型,但只有元素类型是必要的,在不指定容器类型时,默认的容器类型 ...

  10. 用WP SMTP插件实现邮件发送功能

    WordPress本身是采用mail()函数发邮件的,但是这样发出的邮件很容易被放入垃圾箱,很多主机商(特别是Windows主机)为了避免用户滥发邮件直接禁用了mail()函数,还有些云计算平台(比如 ...