BZOJ 4455: [Zjoi2016]小星星
Sol
容斥原理+树形DP.
这道题用的容斥思想非常妙啊!主要的思路就是让所有点与S集合中的点对应,可以重复对应,并且可以不用对应完全(意思是是S的子集也可以).这样他有未对应完全的,那就减去,从全都一一对应到少对应几个,减号套减号,就形成了容斥关系,看S中元素个数与n的关系,如果相差奇数个,那就减去,相差偶数个,那就加上.用树形DP转移,枚举当前节点选哪一个,再枚举子节点选哪一个,如果两个有连线就统计到答案里.因为每个节点只进入一次,转移是 \(n^2\) 的,枚举子集是 \(2^n\) 总复杂度就是 \(O(2^nn^3)\)
Code
/**************************************************************
Problem: 4455
User: BeiYu
Language: C++
Result: Accepted
Time:6200 ms
Memory:1296 kb
****************************************************************/ #include<cstdio>
#include<vector>
#include<iostream>
using namespace std; const int N = 18;
typedef long long LL; int n,m,S;LL ans;
LL f[N][N];
int q[N],t,pow2[N];
bool b[N][N];
vector<int> g[N]; void DP(int x,int fa=0){
for(int i=1;i<=t;i++) f[x][q[i]]=1;
for(int i=0,v;i<g[x].size();i++) if((v=g[x][i])!=fa){
DP(v,x);
for(int j=1;j<=t;j++){
LL tmp=0;
for(int k=1;k<=t;k++) if(b[q[j]][q[k]]) tmp+=f[v][q[k]];
f[x][q[j]]*=tmp;
}
}
}
void calc(const int &S){ t=0;for(int i=1;i<=n;i++) if(S&pow2[i-1]) q[++t]=i; }
inline int in(int x=0,char ch=getchar()){ while(ch>'9'||ch<'0') ch=getchar();
while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x; }
int main(){
n=in(),m=in();pow2[0]=1;for(int i=1;i<18;i++) pow2[i]=pow2[i-1]<<1;
for(int i=1,u,v;i<=m;i++) u=in(),v=in(),b[u][v]=b[v][u]=1;
for(int i=1,u,v;i<n;i++) u=in(),v=in(),g[u].push_back(v),g[v].push_back(u);
for(S=1;S<(1<<n);S++){
calc(S);DP(1,0);LL tmp=0;
for(int i=1;i<=t;i++) tmp+=f[1][q[i]];
if((n-t)&1) ans-=tmp;else ans+=tmp;
}return printf("%lld\n",ans),0;
}
BZOJ 4455: [Zjoi2016]小星星的更多相关文章
- BZOJ 4455: [Zjoi2016]小星星 [容斥原理 树形DP]
4455: [Zjoi2016]小星星 题意:一个图删掉一些边形成一棵树,告诉你图和树的样子,求让图上的点和树上的点对应起来有多少方案 看了很多题解又想了一段时间,感觉题解都没有很深入,现在大致有了自 ...
- bzoj 4455 [Zjoi2016]小星星 树形dp&容斥
4455: [Zjoi2016]小星星 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 643 Solved: 391[Submit][Status] ...
- BZOJ 4455: [Zjoi2016]小星星(容斥+树形dp)
传送门 解题思路 首先题目中有两个限制,第一个是两个集合直接必须一一映射,第二个是重新标号后,\(B\)中两点有边\(A\)中也必须有.发现限制\(2\)比较容易满足,考虑化简限制\(1\).令\(f ...
- 【BZOJ 4455】 4455: [Zjoi2016]小星星 (容斥原理+树形DP)
4455: [Zjoi2016]小星星 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 426 Solved: 255 Description 小Y是 ...
- 4455[Zjoi2016]小星星 容斥+dp
4455: [Zjoi2016]小星星 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 527 Solved: 317[Submit][Status] ...
- 【UOJ】【BZOJ】 [Zjoi2016]小星星
题目链接: http://uoj.ac/problem/185 http://www.lydsy.com/JudgeOnline/problem.php?id=4455 考虑枚举原图中我选择哪一些点, ...
- 4455: [Zjoi2016]小星星|状压DP|容斥原理
OrzSDOIR1ak的晨神 能够考虑状压DP枚举子集,求出仅仅保证连通性不保证一一相应的状态下的方案数,然后容斥一下就是终于的答案 #include<algorithm> #includ ...
- 【bzoj 4455】小星星(树型DP+容斥原理+dfs建树和计算的2种方式)
题意:给一个n个点的图和一个n个点的树,求图和树上的点一一对应的方案数.(N<=17) 解法:1.在树的结构上进行tree DP,f[i][j]表示树上点 i 对应图上点 j 时,这个点所在子树 ...
- [BZOJ 4455] [ZJOI 2016] 小星星 (树形dp+容斥原理+状态压缩)
[BZOJ 4455] [ZJOI 2016] 小星星 (树形dp+容斥原理+状态压缩) 题面 给出一棵树和一个图,点数均为n,问有多少种方法把树的节点标号,使得对于树上的任意两个节点u,v,若树上u ...
随机推荐
- 中缀表达式转后缀表达式(用于求字符串表达式值)(js栈和队列的实现是通过数组的push和unshift方法插值,pop方法取值)
中缀表达式:就是我通常用的算术或逻辑公式: 后缀表达式:不包含括号,运算符放在两个运算对象后面,所有的计算按运算符出现的顺序,严格从左向右进行,不用考虑运算符优先级: 如,(2+1)*3 转换后,2 ...
- DecimalFormat类
DecimalFormat类也是Format的一个子类,主要作用是格式化数字. 在格式化数字的时候比直接使用NumberFormat更加方便,因为可以直接指定按用户自定义的方式进行格式化操作,与Sim ...
- Java学习笔记2
package welcome; public class Constants { public static void main(String[] args){ final double CM_PE ...
- os模块之popen
想查看当前目录下有哪些东西,可以使用os.popen()方法,代码如下: t = (os.popen("dir")) print(t.read()) #运行结果 C:\python ...
- C++ Scripting
http://www.quepublishing.com/articles/article.aspx?p=26069
- setTimeout不断重复执行
setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式. setTimeout(code,millisec) code 必需.要调用的函数后要执行的 JavaScript 代码串. ...
- IIS 8.5 伪静态去掉index.php thinkphp 3.2.2
因为测试都是在win下开发的 win8.1企业版 II8.5 首先安装 Thinkphp 3.2.2 URL Rewrite Module 2.0 http://www.iis.net/downlo ...
- 409. Longest Palindrome
Given a string which consists of lowercase or uppercase letters, find the length of the longest pali ...
- php二维数组排序的处理
一维数组排序可以使用asort.ksort等一些方法进程排序,相对来说比较简单.二维数组的排序怎么实现呢?使用array_multisort和usort可以实现 例如像下面的数组: 代码如下: ...
- ehcache memcache redis 三大缓存男高音
最近项目组有用到这三个缓存,去各自的官方看了下,觉得还真的各有千秋!今天特意归纳下各个缓存的优缺点,仅供参考! Ehcache 在java项目广泛的使用.它是一个开源的.设计于提高在数据从RDBMS ...