题意

给出一棵树和一个图,问有多少种方法把树的节点标号使得其在改图中至少有一棵生成树与原来的树是重构的。
n<=17

分析

想到了容斥,但是没想到从哪里容斥。。。
显然题目给了两个限制,一个是原树中的每条边都要在图中出现,一个是每个标号仅出现一次。
我们可以在必须满足第一个限制的前提下,对第二个限制进行容斥。
假设现在知道了那些号是不能标的,那么我们就可以通过树形dp来得到方案数:设f[i,j]表示节点i标号为j的方案数,然后枚举其儿子的方案数,转移随便搞即可。
那么答案就是随便标的方案数-1个标号不能用的方案数+2个标号不能用的方案数。。。。
为什么呢?
因为每个标号不能重复,那么就要用全部情况减去有重复的情况。如果有一个标号不能选,那就表明必然至少有一个会重复,所以正确性显然。

总结

今天做了两道类似的题,一道是bzoj 4596: [Shoi2016]黑暗前的幻想乡,另一道就是这道啦。
方法都是容斥,那么我想总结一下类似题目的一般套路。
首先你得想得到要用容斥,可以记住某位大神所说的,看到计数想容斥。
然后找到题目所给的限制。bzoj 4596中的限制一个是必须是生成树,另一个是必须每条边属于不同的公司。这题的限制在上面。
那么我们就可以在满足题目所给的其余限制的前提下,对其中一个限制进行容斥,也就是先不管这个限制,再减去其不符合限制的答案即可。

代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;typedef long long LL;const int N=20;int n,m,cnt,a1,a[N],last[N],map[N][N];
struct edge{int to,next;}e[N*2];
LL ans,f[N][N];void addedge(int u,int v)
{e[++cnt].to=v;e[cnt].next=last[u];last[u]=cnt;e[++cnt].to=u;e[cnt].next=last[v];last[v]=cnt;
}void dp(int x,int fa,int s)
{for (int i=last[x];i;i=e[i].next)if (e[i].to!=fa) dp(e[i].to,x,s);for (int i=1;i<=a1;i++){f[x][i]=1;for (int j=last[x];j;j=e[j].next){if (e[j].to==fa) continue;LL w=0;for (int k=1;k<=a1;k++)if (map[a[i]][a[k]]) w+=f[e[j].to][k];f[x][i]*=w;}}
}LL calc(int s)
{a1=0;for (int i=1;i<=n;i++) if (!(s&(1<<(i-1)))) a[++a1]=i;dp(1,0,s);LL ans=0;for (int i=1;i<=a1;i++) ans+=f[1][i];return ans;
}void dfs(int x,int y,int s)
{if (x>n){ans+=y*calc(s);return;}dfs(x+1,y,s);dfs(x+1,-y,s+(1<<(x-1)));
}int main()
{scanf("%d%d",&n,&m);for (int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);map[x][y]=map[y][x]=1;}for (int i=1;i<n;i++){int x,y;scanf("%d%d",&x,&y);addedge(x,y);}dfs(1,1,0);printf("%lld",ans);return 0;
}

bzoj 4455: [Zjoi2016]小星星 树形dp+容斥原理相关推荐

  1. bzoj 4455 [Zjoi2016]小星星 树形dp容斥

    4455: [Zjoi2016]小星星 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 643  Solved: 391 [Submit][Statu ...

  2. [容斥 状压DP 树形DP] BZOJ 4455 [Zjoi2016]小星星 UOJ #185 【ZJOI2016】小星星

    杜老师说的哦 据说有人n*3^n卡过去 ? UOJ上需要卡常哦 #include<cstdio> #include<cstdlib> #include<algorithm ...

  3. bzoj 4455: [Zjoi2016]小星星

    链接 http://www.lydsy.com/JudgeOnline/problem.php?id=4455 dp+容斥题意大约是树上的点满足与图上的点一一对应并且图中两两有边,树中也两两有边,求满 ...

  4. 4455: [Zjoi2016]小星星

    4455: [Zjoi2016]小星星 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 246  Solved: 161 [Submit][Statu ...

  5. bzoj4455UOJ185 [Zjoi2016]小星星(树形DP+容斥原理)

    bzoj4455&UOJ185 [Zjoi2016]小星星 原题地址: http://www.lydsy.com/JudgeOnline/problem.php?id=4455 http:// ...

  6. BZOJ 2133 切割(树形DP,树上背包)大概是本题全网第一篇题解 >_<【BZOJ 修复工程】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 BZOJ 2133 切割这道题全网搜不到任何一篇题解 >_< 看评测记录也没有几个人AC- ...

  7. 【UOJ】【BZOJ】 [Zjoi2016]小星星

    题目链接: http://uoj.ac/problem/185 http://www.lydsy.com/JudgeOnline/problem.php?id=4455 考虑枚举原图中我选择哪一些点, ...

  8. BZOJ 1040 ZJOI2008 骑士 树形DP

    题目大意:给定一个基环树林,每一个点上有权值,要求选择一个权值和最大的点集,要求点集中的随意两个点之间不能直接相连 最大点独立集--考虑到n<=100W,网络流铁定跑不了,于是我们考虑树形DP ...

  9. bzoj 3743 [Coci2015]Kamp——树形dp+换根

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3743 树形dp+换根. "从根出发又回到根" 减去 "mx & ...

最新文章

  1. 在windows10中安装 linux ubuntu 子系统
  2. Active Directory还原工具之三Software Active Directory Recycle Bin PowerPack
  3. 运行launch文件报错Roslaunch got a ‘No such file or directory‘ error while attempting to run:
  4. 专 linux命令之set x详解
  5. create-react-app的template和assembed resource
  6. 人工智能实战小程序之语音_前端开发
  7. 查看驱动安装错误日志
  8. 【2013高考作文】重庆作文
  9. mdf ldf 导入 mysql_mdf, ldf文件导入到sql server 2005的方法
  10. 华为交换机将端口由trunk更改为access报错解决方法
  11. UserWarning: Glyph 20809 (\N{CJK UNIFIED IDEOGRAPH-5149}) missing from current font解决方法
  12. 备份oracle数据库
  13. Android 9.0以上联网报错:CLEARTEXT communication to xxx.xxx.xxx.xx not permitted by network security policy
  14. word自带公式编辑_关于Word内置公式编辑器不能使用的解决方法,请收藏
  15. [含论文+源码等]基于SSM实现的新闻发布系统
  16. 南卡骨传导耳机斩获缪斯国际设计大奖,成为中国品牌影响力的代表
  17. 计算机视觉与图像识别综述
  18. 数值分析复化梯形公式matlab,数值分析复化梯形公式,复化Simpson公式MATLAB程序
  19. Unity Post process volume 体积框线消失
  20. 考研数学 每日一题 十六天

热门文章

  1. 74194/74LS194 四位移位寄存器
  2. 华为发布Petal Maps:与人类想象力共振地图的边界
  3. MOS管,三极管基础知识总结
  4. 调试器(debugger)是如何工作的
  5. BlackBerry 9850 大屏幕黑莓手机
  6. 验收报告模版(转载)
  7. Unity3D类人动画humanoid animations
  8. Python操作Word的入门教程
  9. 信息设计软件+信息图表设计软件介绍
  10. 信捷服务器Z相信号,USR-G781连接信捷PLC ,使用透传云服务器进行远程上传程序