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]小星星 解题报告的更多相关文章

  1. 洛谷 P1783 海滩防御 解题报告

    P1783 海滩防御 题目描述 WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和仓库总是被敌方派人偷袭 ...

  2. 洛谷 P4597 序列sequence 解题报告

    P4597 序列sequence 题目背景 原题\(\tt{cf13c}\)数据加强版 题目描述 给定一个序列,每次操作可以把某个数\(+1\)或\(-1\).要求把序列变成非降数列.而且要求修改后的 ...

  3. 洛谷1087 FBI树 解题报告

    洛谷1087 FBI树 本题地址:http://www.luogu.org/problem/show?pid=1087 题目描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全 ...

  4. 洛谷 P3177 树上染色 解题报告

    P3177 [HAOI2015]树上染色 题目描述 有一棵点数为\(N\)的树,树边有边权.给你一个在\(0\) ~ \(N\)之内的正整数\(K\),你要在这棵树中选择\(K\)个点,将其染成黑色, ...

  5. 洛谷 P4705 玩游戏 解题报告

    P4705 玩游戏 题意:给长为\(n\)的\(\{a_i\}\)和长为\(m\)的\(\{b_i\}\),设 \[ f(x)=\sum_{k\ge 0}\sum_{i=1}^n\sum_{j=1}^ ...

  6. 洛谷 P1272 重建道路 解题报告

    P1272 重建道路 题目描述 一场可怕的地震后,人们用\(N\)个牲口棚\((1≤N≤150\),编号\(1..N\))重建了农夫\(John\)的牧场.由于人们没有时间建设多余的道路,所以现在从一 ...

  7. 洛谷 [HNOI2014]道路堵塞 解题报告

    [HNOI2014]道路堵塞 题意 给一个有向图并给出一个这个图的一个\(1\sim n\)最短路,求删去这条最短路上任何一条边后的最短路. 又事SPFA玄学... 有个结论,新的最短路一定是\(1\ ...

  8. 洛谷 P1452 Beauty Contest 解题报告

    P1452 Beauty Contest 题意 求平面\(n(\le 50000)\)个点的最远点对 收获了一堆计算几何的卡点.. 凸包如果不保留共线的点,在加入上凸壳时搞一个相对栈顶,以免把\(n\ ...

  9. 洛谷 P4097 [HEOI2013]Segment 解题报告

    P4097 [HEOI2013]Segment 题目描述 要求在平面直角坐标系下维护两个操作: 在平面上加入一条线段.记第 \(i\) 条被插入的线段的标号为 \(i\) 给定一个数 \(k\),询问 ...

随机推荐

  1. LeetCode106. Construct Binary Tree from Inorder and Postorder Traversal

    题目 根据一棵树的中序遍历与后序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 例如,给出 中序遍历 inorder = [9,3,15,20,7] 后序遍历 postorder = [9, ...

  2. LeetCode94. Binary Tree Inorder Traversal

    题目 给定一个二叉树,返回它的中序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 考点 stack ...

  3. spring开篇

    本文引用http://www.cnblogs.com/ityouknow/p/5292559.html spring简介: spring是一个开源框架,spring是于2003 年兴起的一个轻量级的J ...

  4. 最小化 Java 镜像的常用技巧

    背景 随着容器技术的普及,越来越多的应用被容器化.人们使用容器的频率越来越高,但常常忽略一个基本但又非常重要的问题 - 容器镜像的体积.本文将介绍精简容器镜像的必要性并以基于 spring boot ...

  5. is和==,encode和decode

    0.编码解码 >encode和decode a = "你好" s = a.encode("GBK") print(s) # b'\xc4\xe3\xba\ ...

  6. 生产-消费模式的synchronized和lock实现(十)

    lock: package com.net.thread.lock; import java.util.concurrent.locks.Condition; import java.util.con ...

  7. C# 打开帮助文档,打开电脑中其他应用或者文件

    打开帮助文档 System.Diagnostics.Process.Start(Directory.GetCurrentDirectory() + "\\" + "hel ...

  8. 遗传算法 | Java版GA_TSP(我的第一个Java程序)

    嗯哼,第一次写博客,准确说是第一次通过文字的方式记录自己的工作,闲话少叙,技术汪的博客就该直奔技术主题(关于排版问题,会在不断写博客的过程中慢慢学习,先将就着用吧,重在技术嘛~~~). 遗传算法(Ge ...

  9. 笔记-爬虫-selenium常用方法

    笔记-爬虫-selenium常用方法 1.      查找元素 常用的查找方法 find_element_by_name find_element_by_xpath find_element_by_l ...

  10. 正则表达式,regular expression, regex, RE

    正则表达式是用来简洁表达一组字符串的表达式 正则表达式可以用来判断某字符串的特征归属