[ZJOI2016]小星星(容斥+dp)
洛谷链接:https://www.luogu.org/problemnew/show/P3349
题意相当于给一棵树重新赋予彼此不同的编号,要求树上相邻的两个节点在给定的另外一个无向图中也存在边相连。
n很小,但枚举阶乘肯定是会爆炸的。
发现编号彼此不同对统计答案的影响太大了,我们可以尝试先让编号可以重复,但是限制可以选用的编号集,即O(2^n)枚举n个数的子集,然后容斥一下答案。
可选用的编号集合确定了,编号还可以重复,接下来直接跑树形dp就可以了。f(u)(j)存的是u节点映射向j,子树内的总方案数。
#include<bits/stdc++.h>
using namespace std;
const int N=40;
typedef long long ll;
#define rep(i,a,b) for(register int i=(a);i<=(b);++i)
#define il inline
int gr,h[N],nxt[N],to[N];
il void tu(int x,int y){to[++gr]=y,nxt[gr]=h[x],h[x]=gr;}
int n,m,mp[N][N],p[N],tot;
ll ans,dp[18][18],tmp;
void dfs(int u,int f){
rep(j,1,tot)dp[u][j]=1;
for(int i=h[u];i;i=nxt[i]){
int d=to[i];
if(d==f)continue;
dfs(d,u);
rep(j,1,tot){
tmp=0;
rep(k,1,tot){
if(mp[p[j]][p[k]]) tmp+=dp[d][k];
}
dp[u][j]*=tmp;
}
}
}
int main(){
scanf("%d%d",&n,&m);
int a,b;
rep(i,1,m)scanf("%d%d",&a,&b),mp[a][b]=mp[b][a]=1;
rep(i,1,n-1)scanf("%d%d",&a,&b),tu(a,b),tu(b,a);
rep(j,1,(1<<n)-1){tot=0;
rep(i,0,n-1){
if((j>>i)&1)p[++tot]=i+1;
}
dfs(1,0);tmp=0;
rep(i,1,tot)tmp+=dp[1][i];
ans+=(((n-tot)&1)?-1ll:1ll)*tmp;
}
printf("%lld\n",ans);
return 0;
}
[ZJOI2016]小星星(容斥+dp)的更多相关文章
- 4455[Zjoi2016]小星星 容斥+dp
4455: [Zjoi2016]小星星 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 527 Solved: 317[Submit][Status] ...
- 「LOJ2091」「ZJOI2016」小星星 容斥+DP
题目描述 小 Y 是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有\(n\)颗小星星,用 \(m\)条彩色的细线串了起来,每条细线连着两颗小星星.有一天她发现,她的饰品被破坏了,很多细线都被拆掉 ...
- UOJ185 ZJOI2016 小星星 容斥、树形DP
传送门 先考虑一个暴力的DP:设\(f_{i,j,S}\)表示点\(i\)映射到了图中的点\(j\),且点\(i\)所在子树的所有点映射到了图中的集合\(S\)时的映射方案数,转移暴力地枚举子集即可, ...
- BZOJ 4455: [Zjoi2016]小星星(容斥+树形dp)
传送门 解题思路 首先题目中有两个限制,第一个是两个集合直接必须一一映射,第二个是重新标号后,\(B\)中两点有边\(A\)中也必须有.发现限制\(2\)比较容易满足,考虑化简限制\(1\).令\(f ...
- 【BZOJ 4455】 [Zjoi2016]小星星 容斥计数
dalao教导我们,看到计数想容斥……卡常策略:枚举顺序.除去无效状态.(树结构) #include <cstdio> #include <cstring> #include ...
- HDU 5794 A Simple Chess (容斥+DP+Lucas)
A Simple Chess 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5794 Description There is a n×m board ...
- [CF1086E]Beautiful Matrix(容斥+DP+树状数组)
给一个n*n的矩阵,保证:(1)每行都是一个排列 (2)每行每个位置和上一行对应位置不同.求这个矩阵在所有合法矩阵中字典序排第几.考虑类似数位DP的做法,枚举第几行开始不卡限制,那么显然之前的行都和题 ...
- 【BZOJ3622】已经没有什么好害怕的了 容斥+DP
[BZOJ3622]已经没有什么好害怕的了 Description Input Output Sample Input 4 2 5 35 15 45 40 20 10 30 Sample Output ...
- $bzoj2560$ 串珠子 容斥+$dp$
正解:容斥+$dp$ 解题报告: 传送门$QwQ$ $umm$虽然题目蛮简练的了但还是有点难理解,,,我再抽象一点儿,就说有$n$个点,点$i$和点$j$之间有$a_{i,j}$条无向边可以连,问有多 ...
随机推荐
- Java开发中的几种对象的说明(PO,VO,DTO,BO,POJO,DAO,SAO等)
一.PO :(persistant object ),持久对象 可以看成是与数据库中的表相映射的java对象.使用Hibernate来生成PO是不错的选择. 二.VO :(value object) ...
- android.os.TransactionTooLargeException
android.os.TransactionTooLargeException 今天开发过程共遇到问题,后台要反回一些表格,不是单纯的数据.就是有一些html标签的东西.错误的思路: 我得到数据后通过 ...
- [Python]通过websocket与jsclient通信
站点大多使用HTTP协议通信.而HTTP是无连接的协议.仅仅有client请求时,server端才干发出对应的应答.HTTP请求的包也比較大,假设仅仅是非常小的数据通信.开销过大.于是,我们能够使用w ...
- hdu oj 3371 Connect the Cities (最小生成树)
Connect the Cities Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- compact处理流程分析
compact处理流程分析 compact的处理与split同样.由client端与flush时检查发起. 针对compact另一个在rs生成时生成的CompactionChecker线程定期去检查是 ...
- android自带的处理Bitmap out Memory 的处理,我仅仅是改变了些写法成为自己用的东西
每天上万次的启动载入证明这个载入是不错的; 第三方的载入框架非常多,推荐使用成熟框架,比方大家都知道的ImageLoad等, 这里的仅仅供学习; 我也曾在一个菜谱的项目里写过载入手机相冊图片的,只是当 ...
- 我在SharePoint行业的从业经历(二)
本文是我的SharePoint从业经历的第二篇,第一篇请參考 我在SharePoint行业的从业经历(一) 做完那个项目之后.对SharePoint 2003有了一些认识. 可是后来几年我就没在 ...
- Codeforces--106C--Buns(背包)
Buns Time Limit: 2000MS Memory Limit: 262144KB 64bit IO Format: %I64d & %I64u Submit Status ...
- glance rabbit
- Python中的math和保留小数位数方法
转载自 http://xukaizijian.blog.163.com/blog/static/17043311920111163272414/ math模块实现了许多对浮点数的数学运算函数. 这些 ...