[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的牛棚的屋顶.门被吹飞了. 好在许多牛正在度假,所以牛棚没有住满. 牛棚一个紧挨着另一个被排成一行,牛就住在里面过夜. 有些牛棚里有牛 ...
随机推荐
- K. Random Numbers(Gym 101466K + 线段树 + dfs序 + 快速幂 + 唯一分解)
题目链接:http://codeforces.com/gym/101466/problem/K 题目: 题意: 给你一棵有n个节点的树,根节点始终为0,有两种操作: 1.RAND:查询以u为根节点的子 ...
- [整理] magento搬家
将原来网站文件中的var文件中的cache和session文件删除,将media中的缓存文件删除.然后将所有文件制作成一个压缩包,以减少文件体积,方便转移. 将压缩包转移到新的服务器域名指向的文件夹, ...
- SQLite3 使用教学
source: SQL中文站:http://www.sqlite.com.cn/MySqlite/4/378.Html OS X自从10.4后把SQLite这套相当出名的数据库软件,放进了作业系统工具 ...
- Petrozavodsk Summer Training Camp 2017 Day 9
Petrozavodsk Summer Training Camp 2017 Day 9 Problem A. Building 题目描述:给出一棵树,在树上取出一条简单路径,使得该路径的最长上升子序 ...
- Python Random模块生成伪随机数字
This module implements pseudo-random number generators for various distributions. 对于整数,有一个范围的均匀选择: 对 ...
- 在delphi原有控件基础上画图
var C:TControlCanvas; begin C := TControlCanvas.Create; C.Pen.Color := clRed; C.Pen.Width := ; C.Con ...
- jquery重置
在使用jquery时要先引用 <script type="text/javascript" src="/Themes/Default/Js/jquery-1.11. ...
- 【PAT】1010. 一元多项式求导 (25)
1010. 一元多项式求导 (25) 设计函数求一元多项式的导数.(注:xn(n为整数)的一阶导数为n*xn-1.) 输入格式:以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数 ...
- 【PAT】1006. 换个格式输出整数 (15)
1006. 换个格式输出整数 (15) 让我们用字母B来表示“百”.字母S表示“十”,用“12...n”来表示个位数字n(<10),换个格式来输出任一个不超过3位的正整数.例如234应该被输出为 ...
- java EE :Servlet 接口
Servlet 生命周期 : 调用当前 Servlet 类构造函数进行实例化 Servlet 通过调用 init () 方法进行初始化 Servlet 调用 service() 方法来处理客户端的请 ...