【BZOJ4455】小星星(动态规划,容斥)
【BZOJ4455】小星星(动态规划,容斥)
题面
题解
题意说简单点就是给定一张\(n\)个点的图和一棵\(n\)个点的树,现在要让图和树之间的点一一对应,并且如果树上存在一条边,那么图上对应的点对之间也要存在边。
我们直接求解显然很麻烦,一一对应是一个很不好算的东西。
那么我们先要求并不需要一一对应,随意对应即可,最后再减掉不合法的方案,这样就可以用容斥来解决。
怎么容斥呢?无非是考虑没有一一对应的关系,那么我们先暴力枚举一下哪些点在图上可以和树上的点进行对应,其他的点不能够和树上的点进行匹配。
那么考虑\(dp\)计算方案数。
设\(f[i][j]\)表示当前以\(i\)为根的子树(假装以\(1\)号点为根节点的有根树),并且\(i\)在图上对应的点是\(j\)的方案数。
每次暴力选择一个和当前\(i\)匹配的点,然后再暴力找到这个点在图中的所有儿子,并且用子树进行转移,这样\(dp\)一次的复杂度是\(O(n\times n\times n)\),即树上每个点都要做一次,要暴力枚举和哪个点进行匹配,还需要暴力枚举儿子是哪个点,当然这样肯定不满。
再加上暴力枚举可以进行匹配的点集的枚举,
所以总的时间复杂度是\(O(n^32^n)\)
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define ll long long
#define MAX 20
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
struct Line{int v,next;}e1[MAX*MAX<<1],e2[MAX<<1];
int h1[MAX],h2[MAX];
int cnt1=1,cnt2=1;
int n,m,cnt,a[MAX];
inline void Add1(int u,int v){e1[cnt1]=(Line){v,h1[u]};h1[u]=cnt1++;}
inline void Add2(int u,int v){e2[cnt2]=(Line){v,h2[u]};h2[u]=cnt2++;}
ll f[MAX][MAX],ans=0,num;
void dfs(int u,int ff)
{
for(int i=h2[u];i;i=e2[i].next)
if(e2[i].v!=ff)dfs(e2[i].v,u);
for(int i=1;i<=cnt;++i)//枚举当前点得到匹配点
{
f[u][a[i]]=1;
for(int j=h2[u];j;j=e2[j].next)
if(e2[j].v!=ff)
{
num=0;
for(int k=h1[a[i]];k;k=e1[k].next)num+=f[e2[j].v][e1[k].v];
f[u][a[i]]*=num;
if(!f[u][a[i]])break;
}
}
}
int main()
{
n=read();m=read();
for(int i=1,u,v;i<=m;++i)u=read(),v=read(),Add1(u,v),Add1(v,u);
for(int i=2,u,v;i<=n;++i)u=read(),v=read(),Add2(u,v),Add2(v,u);
for(int i=1;i<(1<<n);++i)//枚举可以进行匹配的点集
{
cnt=0;memset(f,0,sizeof(f));
for(int j=0;j<n;++j)if(i&(1<<j))a[++cnt]=j+1;
dfs(1,0);num=0;
for(int j=1;j<=cnt;++j)num+=f[1][a[j]];
if((n-cnt)&1)ans-=num;else ans+=num;
}
printf("%lld\n",ans);
return 0;
}
【BZOJ4455】小星星(动态规划,容斥)的更多相关文章
- 【BZOJ4559】[JLoi2016]成绩比较 动态规划+容斥+组合数学
[BZOJ4559][JLoi2016]成绩比较 Description G系共有n位同学,M门必修课.这N位同学的编号为0到N-1的整数,其中B神的编号为0号.这M门必修课编号为0到M-1的整数.一 ...
- [ZJOI2016]小星星(容斥+dp)
洛谷链接:https://www.luogu.org/problemnew/show/P3349 题意相当于给一棵树重新赋予彼此不同的编号,要求树上相邻的两个节点在给定的另外一个无向图中也存在边相连. ...
- [zjoi2016]小星星 (容斥+DP)
我们先用树形DP,求出选取集合S中的点,满足连通性的但是标号可重的方案数,贡献给F(i)(1\(\leq\)i\(\leq\)\(\mid S\mid\)),也就是我们要处理出F(i)代表取至多i个点 ...
- 【BZOJ-4455】小星星 容斥 + 树形DP
4455: [Zjoi2016]小星星 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 204 Solved: 137[Submit][Status] ...
- [BZOJ4455][ZJOI2016]数星星(容斥DP)
4455: [Zjoi2016]小星星 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 707 Solved: 419[Submit][Status] ...
- 【BZOJ5287】[HNOI2018]毒瘤(动态规划,容斥)
[BZOJ5287][HNOI2018]毒瘤(动态规划,容斥) 题面 BZOJ 洛谷 题解 考场上想到的暴力做法是容斥: 因为\(m-n\le 10\),所以最多会多出来\(11\)条非树边. 如果就 ...
- 【LOJ#2542】[PKUWC2018]随机游走(min-max容斥,动态规划)
[LOJ#2542][PKUWC2018]随机游走(min-max容斥,动态规划) 题面 LOJ 题解 很明显,要求的东西可以很容易的进行\(min-max\)容斥,那么转为求集合的\(min\). ...
- [ZJOI2016]小星星&[SHOI2016]黑暗前的幻想乡(容斥)
这两道题思路比较像,所以把他们放到一块. [ZJOI2016]小星星 题目描述 小Y是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有n颗小星星,用m条彩色的细线串了起来,每条细线连着两颗小星星. ...
- 【BZOJ2024】舞会(动态规划,容斥,高精度)
[BZOJ2024]舞会(动态规划,容斥,高精度) 题面 BZOJ 洛谷 题解 这种关系显然要先排序才不会不想影响. 设\(f[i][j]\)表示前\(i\)个女生中,选了\(j\)个女生配对,并且女 ...
随机推荐
- DSP5509项目之用FFT识别钢琴音调(5)之开始傅里叶变换
1. 首先电脑上下载一个音频模拟的软件 2. 研究下钢琴的声音范围27HZ到4000HZ,那么采样频率需要是信号的两倍频率以上,所以建议采样频率是16KHZ.先看一下采集到的数据,如下是空载时候采集到 ...
- arcpy示范教学(一):基本操作
arcpy基本操作 打开目录,遍历目录,打开要素类,遍历要素,打开文件,写入属性值 import arcpy import codecs # 设置工作目录 arcpy.env.workspace = ...
- zookeeper 简单小节
1. ZooKeeper 是什么 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务.主要用来解决分布式集群中应用系统的一致性问题,它能提供基于类似于文件系统的目录节点树方式的数据存储 ...
- Appium 运行脚本报错InvalidSelectorException: Message: Locator Strategy 'css selector' is not supported for (转)
现象:Appium运行脚本报错InvalidSelectorException: Message: Locator Strategy 'css selector' is not supported f ...
- Windows下Mongo分片及集群
这里简单介绍一下windows下mongodb的分片设置和集群搭建,希望能够为迷茫的新手起到一点点作用.其实windows下与linux下思路是一致的,只是绑定时的ip,与端口号不同,linux下可以 ...
- vue的ui库使用Element UI,纯html页面,不使用webpack那玩意
使用手册访问:https://cloud.tencent.com/developer/doc/1270 第一步:在head添加样式 <link rel="stylesheet" ...
- NO.3:自学python之路------集合、文件操作、函数
引言 本来计划每周完成一篇Python的自学博客,由于上一篇到这一篇遇到了过年.开学等杂事,导致托更到现在.现在又是一个新的学期,春天也越来越近了(冷到感冒).好了,闲话就说这么多.开始本周的自学Py ...
- asp.net mvc同一个view展示多个不同列表思路
asp.net mvc一个模型一个view容易展示,可是遇到像首页那样,要同时调用好几个不同表的内容一小部分展示时,该怎么是好呢? 下边根据我的测试,用的是mvc access数据测试 先建立一个强类 ...
- 华为中兴借eBay出海 靠零售渠道撬动市场
在跨境电商领域,大多数中国商家依靠“中国制造”的优势和价格战策略打拼出一条血路,在海外市场占领了自己的一席 之地.不过,山寨货纷纷出海的同时,中国本土的品牌商们也开始了探索海外市场之旅.目前,华为.中 ...
- pyextend库-merge可迭代对象合并函数
pyextend - python extend lib merge (iterable1, *args) 参数: iterable1: 实现 __iter__的可迭代对象, 如 str, tupl ...