洛谷 P3349 [ZJOI2016]小星星 解题报告
P3349 [ZJOI2016]小星星
题目描述
小\(Y\)是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品。她有\(n\)颗小星星,用\(m\)条彩色的细线串了起来,每条细线连着两颗小星星。
有一天她发现,她的饰品被破坏了,很多细线都被拆掉了。这个饰品只剩下了\(n-1\)条细线,但通过这些细线,这颗小星星还是被串在一起,也就是这些小星星通过这些细线形成了树。小\(Y\)找到了这个饰品的设计图纸,她想知道现在饰品中的小星星对应着原来图纸上的哪些小星星。如果现在饰品中两颗小星星有细线相连,那么要求对应的小星星原来的图纸上也有细线相连。小\(Y\)想知道有多少种可能的对应方式。
只有你告诉了她正确的答案,她才会把小饰品做为礼物送给你呢。
输入输出格式
输入格式:
第一行包含\(2\)个正整数\(n\),\(m\),表示原来的饰品中小星星的个数和细线的条数。
接下来\(m\)行,每行包含\(2\)个正整数\(u\),\(v\),表示原来的饰品中小星星\(u\)和\(v\)通过细线连了起来。
这里的小星星从\(1\)开始标号。保证\(u≠v\),且每对小星星之间最多只有一条细线相连。
接下来\(n-1\)行,每行包含个\(2\)正整数\(u,v\),表示现在的饰品中小星星\(u\)和\(v\)通过细线连了起来。保证这些小星星通过细线可以串在一起。
输出格式:
输出共\(1\)行,包含一个整数表示可能的对应方式的数量。如果不存在可行的对应方式则输出\(0\)。
说明:
\(n<=17,m<=n*(n-1)/2\)
说起来这个题我看了很久啊。。
读题解也读了半天
始终搞不懂暴力的\(dp\)的复杂度是怎么证明的
题意:大致借用一下你谷题解的说法,求树\(T\)到图\(G\)的映射个数,要求点的映射一一对应,点引出的边在图中存在
图中每个点都被映射一次是个麻烦点,这要求我们现有映射集合作为状态存下来
于是这样暴力
\(dp_{i,j,s}\)代表\(i\)点映射为\(j\)点后,以\(i\)为子树的一个映射集合为\(s\)
转移时枚举\(S\)的子集,然后一个子树一个子树的枚举过去(复杂度似乎是乘起来的。。
判断一下有没有连边是否统计就可以了
既然每个点被映射一次很麻烦,不如去掉这个鬼限制
我们随便映射,只有恰好都映射的是合法的
考虑先减掉图中一个点没有被映射的情况,然后加上两个点没有,....
也就是说,我们把可以映射的点的每个子集的答案求出来,然后根据容斥原理加或者减就可以了
每一次的映射集合我们都做一次树形dp
复杂度:\(O(n^32^n)\)
Code:
#include <cstdio>
#define ll long long
ll dp[18][18];
int n,m,ha[18],g[18][18];
int Next[50],head[18],to[50],cnt;
void add(int u,int v)
{
to[++cnt]=v,Next[cnt]=head[u],head[u]=cnt;
to[++cnt]=u,Next[cnt]=head[v],head[v]=cnt;
}
void dfs(int now,int fa)
{
for(int i=head[now];i;i=Next[i])
{
int v=to[i];
if(v!=fa) dfs(v,now);
}
for(int i=1;i<=ha[0];i++)
{
dp[now][i]=1;
for(int j=head[now];j;j=Next[j])
{
int v=to[j];ll sum=0;
if(v==fa) continue;
for(int k=1;k<=ha[0];k++)
sum+=dp[v][k]*g[ha[i]][ha[k]];
dp[now][i]*=sum;
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int u,v,i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
g[u][v]=g[v][u]=1;
}
for(int u,v,i=1;i<n;i++)
{
scanf("%d%d",&u,&v);
add(u,v);
}
ll ans=0;
for(int s=1;s<1<<n;++s)
{
ha[0]=0;ll sum=0;
for(int i=0;i<n;i++) if(s>>i&1) ha[++ha[0]]=i+1;
dfs(1,0);
for(int i=1;i<=ha[0];i++) sum+=dp[1][i];
if(n-ha[0]&1) ans-=sum;
else ans+=sum;
}
printf("%lld\n",ans);
return 0;
}
2018.9.7
洛谷 P3349 [ZJOI2016]小星星 解题报告的更多相关文章
- 洛谷 P1783 海滩防御 解题报告
P1783 海滩防御 题目描述 WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和仓库总是被敌方派人偷袭 ...
- 洛谷 P4597 序列sequence 解题报告
P4597 序列sequence 题目背景 原题\(\tt{cf13c}\)数据加强版 题目描述 给定一个序列,每次操作可以把某个数\(+1\)或\(-1\).要求把序列变成非降数列.而且要求修改后的 ...
- 洛谷1087 FBI树 解题报告
洛谷1087 FBI树 本题地址:http://www.luogu.org/problem/show?pid=1087 题目描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全 ...
- 洛谷 P3177 树上染色 解题报告
P3177 [HAOI2015]树上染色 题目描述 有一棵点数为\(N\)的树,树边有边权.给你一个在\(0\) ~ \(N\)之内的正整数\(K\),你要在这棵树中选择\(K\)个点,将其染成黑色, ...
- 洛谷 P4705 玩游戏 解题报告
P4705 玩游戏 题意:给长为\(n\)的\(\{a_i\}\)和长为\(m\)的\(\{b_i\}\),设 \[ f(x)=\sum_{k\ge 0}\sum_{i=1}^n\sum_{j=1}^ ...
- 洛谷 P1272 重建道路 解题报告
P1272 重建道路 题目描述 一场可怕的地震后,人们用\(N\)个牲口棚\((1≤N≤150\),编号\(1..N\))重建了农夫\(John\)的牧场.由于人们没有时间建设多余的道路,所以现在从一 ...
- 洛谷 [HNOI2014]道路堵塞 解题报告
[HNOI2014]道路堵塞 题意 给一个有向图并给出一个这个图的一个\(1\sim n\)最短路,求删去这条最短路上任何一条边后的最短路. 又事SPFA玄学... 有个结论,新的最短路一定是\(1\ ...
- 洛谷 P1452 Beauty Contest 解题报告
P1452 Beauty Contest 题意 求平面\(n(\le 50000)\)个点的最远点对 收获了一堆计算几何的卡点.. 凸包如果不保留共线的点,在加入上凸壳时搞一个相对栈顶,以免把\(n\ ...
- 洛谷 P4097 [HEOI2013]Segment 解题报告
P4097 [HEOI2013]Segment 题目描述 要求在平面直角坐标系下维护两个操作: 在平面上加入一条线段.记第 \(i\) 条被插入的线段的标号为 \(i\) 给定一个数 \(k\),询问 ...
随机推荐
- DCMTK读取DICOM文件头信息的三种方法
Howto: Load File Meta-Header Here's an example that shows how to load the File Meta Information Head ...
- axios进行ajax请求得不到数据,cookie无法携带问题
这个坑也是很早之前踩过,今天做项目的时候居然忘了,怎么都拿不到数据,果然好记性不如烂笔头,决定写篇博客来祭奠下我的猪脑子: 原因可能就是你发送请求的时候,需要设置cookie,然而你的cookie并没 ...
- array_unique() - 去除数组中重复的元素值
array_unique() 定义和用法 array_unique() 函数移除数组中的重复的值,并返回结果数组. 当几个数组元素的值相等时,只保留第一个元素,其他的元素被删除. 返回的数组中键名 ...
- python入门基本知识
1. 什么是语言 语言是一个事物与另外一个事物沟通的介质. python则是人(程序员)与计算机沟通的介质. 2. 什么是编程 编程就是程序员将自己想要让计算机做的事情用编程语言翻译出来写到一系列的文 ...
- python_字符串_常用处理
1. 输出原序列的反向互补序列 in1 = open("brca1.fasta", "r") out1 = open("re_brca1.fasta& ...
- 笔记-docker-1
笔记-docker-1 1. 简介 1.1. 什么是Docker? Docker 是世界领先的软件容器平台.开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问 ...
- 笔记-python-coroutine
笔记-python-coroutine 1. 协程 1.1. 协程的概念 协程,又称微线程,纤程.英文名Coroutine.协程是一种用户态的轻量级线程. 线程是系统级别的,它们是由操 ...
- zeppelin的数据集的优化
前面我们介绍了zeppelin的修改,前面由于自己的原因,对zeppelin的修改过于多,现在由于优化了,我们两个类, 一个是zeppelin-server的NotebookServer的类的broa ...
- python读取文件
请参考:http://www.cnblogs.com/sysuoyj/archive/2012/03/14/2395789.html
- Kali2017 Metasploit连接postgresql数据库
msfdb:msf数据库管理命令 1.查看msf数据库连接状态 msf > db_status [*] postgresql selected, no connection //未连接 2.ms ...