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. 第35题:LeetCode138. Copy List with Random Pointer

    题目 给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点. 要求返回这个链表的深度拷贝. 考点 思路 代码 /** * Definition for singly ...

  2. lintcode_69_二叉树的层次遍历

    二叉树的层次遍历   描述 笔记 数据 评测 给出一棵二叉树,返回其节点值的层次遍历(逐层从左往右访问) 您在真实的面试中是否遇到过这个题? Yes 哪家公司问你的这个题? LinkedIn Airb ...

  3. 如何在RedHat 7.0系统中安装mysql 5.7.22

    如何在RedHat 7.0系统中安装mysql 5.7.22 今天给大家介绍一下如何安装mysql5.7,在安装之前,首先要查看的是,你的系统中有没有已经安装过的情况.键入rpm -qa|grep m ...

  4. pwn的一些环境搭建

    <1>pwntools库安装 pwntools是一个CTF框架和漏洞利用开发库,用Python开发,由rapid设计,旨在让使用者简单快速的编写exploit. 本文将基于KUbuntu ...

  5. ethereum(以太坊)(十一)--字节数组(一)

    pragma solidity ^0.4.0; contract byte1{ /* 固定大小字节数组(Fixed-size byte arrays) 固定大小字节数组可以通过bytes1,bytes ...

  6. c++ 计算器 带括号 代码实现

    我用了两个栈 一个用来存数字 一个用来存运算符 这里引入优先度的概念便于理解 不同的运算符有不同的优先度 当优先度高的符号进入栈中 所有比它优先度低的符号都要弹出 对 就是这么霸道 ( 没有优先度 没 ...

  7. MySQL之查询性能优化(一)

    为什么查询速度会慢 通常来说,查询的生命周期大致可以按照顺序来看:从客户端,到服务器,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端.其中“执行”可以认为是整个生命周期中最重要的阶段, ...

  8. echart搭配时间轴进行展示 (本例展示的是多时间 多地区 多指标条件 )

    1:照常先来几张图 看效果  2:首先 看官方文档 我把echart官方的例子给扒下来并整理了得出如下效果 上 案例图和代码 效果图 : 代码: <style type="text/c ...

  9. gettid 和pthread_self的区别

    转: Linux中,每个进程有一个pid,类型pid_t,由getpid()取得.Linux下的POSIX线程也有一个id,类型 pthread_t,由pthread_self()取得,该id由线程库 ...

  10. linux部署环境配置

    https://blog.csdn.net/dsczxcc/article/details/78728330