闲扯

看到多个限制条件的计数题目,就想到容斥原理

思路

题目要求两个条件
- 编号一一对应
- 树上存在的边,在图上映射到的点上也应该存在
考虑一个暴力的dp,设\(dp_{i,j}\)表示i点编号对应到j点的方案数量
转移显然是枚举每个子节点和每个子节点对应的编号
对于每个子节点的不同方案数求和,不同子节点之间乘起来即可,复杂度\(O(n^3)\)
然后这样是错的,因为编号会有重复,不符合限制,考虑容斥
\(2^n\)枚举子集表示哪几个编号不可以被对应,因为每有一个编号不可对应,就代表至少多出一对重复编号的点,就相当于至少重复0次-至少重复1次+至少重复2次...,最后就是一次都不重复的个数了,容斥一下就行了

复杂度\(O(2^n n^3)\)

略微卡常,需要吸氧

代码

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int u[100],v[100],fir[100],nxt[100],cnt,n,m;
void addedge(int ui,int vi){++cnt;u[cnt]=ui;v[cnt]=vi;nxt[cnt]=fir[ui];fir[ui]=cnt;
}
int mat[100][100],stack[100],topx;
long long ans,dp[100][100];
void dfs(int u,int fa){for(int i=fir[u];i;i=nxt[i]){if(v[i]==fa)continue;dfs(v[i],u);}for(int i=1;i<=topx;i++){dp[u][i]=1;for(int j=fir[u];j;j=nxt[j]){if(v[j]==fa)continue;long long tmp=0;for(int k=1;k<=topx;k++)if(mat[stack[i]][stack[k]])tmp+=dp[v[j]][k];dp[u][i]*=tmp;}}
}
signed main(){scanf("%d %d",&n,&m);for(int i=1;i<=m;i++){int a,b;scanf("%d %d",&a,&b);mat[a][b]=mat[b][a]=1;        }for(int i=1;i<n;i++){int a,b;scanf("%d %d",&a,&b);addedge(a,b);addedge(b,a);}for(int S=0;S<(1<<n);S++){// printf("S=%lld ok\n",S);memset(dp,0,sizeof(dp));topx=0;for(int i=1;i<=n;i++)if((1<<(i-1))&S)stack[++topx]=i;dfs(1,0);long long tmp=0;for(int i=1;i<=topx;i++){tmp+=dp[1][i];}ans+=tmp*(((n-topx)%2)?-1:1);}printf("%lld\n",ans);return 0;
}

转载于:https://www.cnblogs.com/dreagonm/p/10427527.html

BZOJ4455 小星星相关推荐

  1. 朴素容斥原理[ZJOI2016][bzoj4455]小星星

    前言 我容斥方面很菜啊,总是一头雾水,于是决心好好学容斥 (从水题刷起) 题意简介 题面链接 题目大意 给出一个nnn个点,mmm条边的无向无重边.无自环的图,再给出一棵nnn个点的树 定义一种对应为 ...

  2. 对于容斥原理反演的思考和总结

    前言 我还是太菜了 容斥之类的方法并不能熟练应用 于是这次我就认真学习了一下容斥 你可能会发现,容斥与反演很多时候都会同时出现 那么,这两个东西分别是什么.究竟有什么关系呢? 容斥 我们先从定义说起 ...

  3. 【BZOJ4455】【UOJ185】【ZJOI2016】小星星(树形DP,容斥原理)

    Description http://uoj.ac/problem/185 Solution 单考虑下面Code中的那个dp函数,设fi,jfi,jf_{i,j}表示iii映射到j" rol ...

  4. bzoj4455 loj2091 [Zjoi2016]小星星 容斥原理+树形DP(+状压DP?)

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4455 https://loj.ac/problem/2091 题解 很不错的一道题.(不过在当 ...

  5. 【状压+容斥】BZOJ4455 [ZJOI2016] 小星星

    [题目] lydsy 一幅nnn个点的树和一棵nnn个点的树,问有多少种点对应方式使得树上存在一条边则图上也存在一条边. n≤17n\leq 17n≤17 [解题思路] 直接求一一对应并不好算,我们可 ...

  6. [bzoj4455][容斥原理][DP]小星星

    Description 小Y是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有n颗小星星,用m条彩色的细线串了起来,每条细 线连着两颗小星星.有一天她发现,她的饰品被破坏了,很多细线都被拆掉了.这 ...

  7. [BZOJ4455][Zjoi2016]小星星

    [Zjoi2016]小星星 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 60 Solved: 52 [Submit][Status][Discuss ...

  8. 2019.02.09 bzoj4455: [Zjoi2016]小星星(容斥原理+dp)

    传送门 题意简述:给一张图和一棵树(点数都为n≤17n \le17n≤17),问有多少种给树的标号方法方法使得图中去掉多余的边之后和树一模一样. 思路: 容斥好题啊. 考虑fi,jf_{i,j}fi, ...

  9. 【BZOJ4455】小星星,容斥原理+树形DP

    传送门 思路: 我一开始想的是考虑i个点不合法来容斥 显然不科学 因为一个点合不合法是取决于其它点的位置的-- 答案实际上求的是"在[1,n]中,没有重复编号的合法方案数"(感觉这 ...

最新文章

  1. Linux用Openssl为Apache签发证书
  2. 10-CSS基础-CSS选择器
  3. Web API 持续集成:PostMan+Newman+Jenkins(图文讲解)
  4. 重新启动C++Builder
  5. 关于inline函数
  6. VF01-billing拆分逻辑详解
  7. 嵌入式成长轨迹37 【Zigbee项目】【CC2430基础实验】【自动闪烁】
  8. C语言那年踩过的坑--局部变量,静态变量,全局变量在内存中存放的位置
  9. Javascript面向对象编程(一):对象的产生
  10. Jquery实现鼠标双击Table单元格变成文本框
  11. 【No.4 Ionic】修改 cordova 插件
  12. 微信小程序登录 code 40029 天坑
  13. pycharm中文乱码
  14. 5年做100款游戏是什么体验?“高产”开发者的10条心得
  15. 通过 SiteServer CMS 推进政府网站集约化、集群化建设
  16. Graph Convolutional Neural Network - Spatial Convolution 图卷积神经网络 — 空域卷积详解
  17. Python爬虫以及数据可视化分析
  18. oracle与甲骨文
  19. linux离线安装snap应用,Ubuntu使用snap安装常用软件
  20. php tps,tps是啥

热门文章

  1. ShareSDK实现一键分享
  2. 无盘工作站(三)-配置 PXE 无盘站软件
  3. ED80/6电力液压推动器
  4. HTML学生个人网站作业设计——html css javascript简单的大学生书店网页制作(13页) web期末作业设计网页 web结课作业的源码 web网页设计实例作业
  5. 自己的价值=有你的世界-没有你的世界
  6. 管理的最高境界不是完美
  7. G003-185-10-图书销售系统项目需求提案计划书
  8. redhat8.2安装过程出错显示DNF error: error in posttrans scriptlet inrpm package kmod-kvdo
  9. 80端口占用问题 -- steam社区打不开
  10. 【Rhapsody学习笔记(二)】Linux环境下的Rhapsody集成引擎安装部署