传送门

题意都需要看题解才能明白我是不是已经废了

题意就是求一个从树\(S\)到图\(T\)的映射,满足若树上的两个点有边,则它们映射在图中的两个点也连有边,且不能有多个点映射到同一个点

我们先不考虑不能有多个点映射到同一个点的限制。设\(dp[u][i]\)表示树上的\(u\)映射为图中的点\(i\)时,\(u\)的子树中合法的方案数。那么只要做一个树形dp即可,复杂度为\(O(n^3)\)

然而如果我们只是按上面那样去做,有可能会产生多个点映射到同一个点的情况。那么我们就要减去图中被映射的点只有\(n-1\)个时的情况。我们可以暴力枚举被剩下的\(n-1\)个点是哪几个,然后再做一次树形dp即可。发现有多减了\(n-2\)个点的情况...

于是不难看出这个其实就是容斥了,枚举图中被选的点,容斥处理即可

//minamoto
#include<bits/stdc++.h>
#define ll long long
#define rint register int
using namespace std;
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[1<<21],*p1=buf,*p2=buf;
int read(){
int res,f=1;char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
const int N=25;
ll dp[N][N],res=0;bool vis[N];int ban[N],mp[N][N];
struct eg{int nx,v;}e[N];int head[N],tot,n,m;
inline void add(int u,int v){e[++tot]={head[u],v},head[u]=tot;}
void dfs(int u){
vis[u]=1;for(rint i=1;i<=n;++i)dp[u][i]=1;
for(rint i=head[u];i;i=e[i].nx){
int v=e[i].v;if(vis[v])continue;dfs(v);
for(rint j=1;j<=n;++j)if(ban[j]){
ll sum=0;
for(rint k=1;k<=n;++k)if(ban[k])sum+=dp[v][k]*mp[k][j];
dp[u][j]*=sum;
}else dp[u][j]=0;
}
}
int main(){
// freopen("testdata.in","r",stdin);
n=read(),m=read();
for(rint i=1,u,v;i<=m;++i)u=read(),v=read(),mp[u][v]=mp[v][u]=1;
for(rint i=1,u,v;i<n;++i)u=read(),v=read(),add(u,v),add(v,u);
for(rint k=1;k<=(1<<n)-1;++k){
int sz=n;for(rint i=1;i<=n;++i)ban[i]=vis[i]=0;
for(rint i=1,p=k;p;p>>=1,++i)ban[i]=p&1,sz-=p&1;
dfs(1);ll ret=0;
for(rint i=1;i<=n;++i)ret+=dp[1][i];
sz&1?res-=ret:res+=ret;
}printf("%lld\n",res);return 0;
}

P3349 [ZJOI2016]小星星的更多相关文章

  1. 洛谷 P3349 [ZJOI2016]小星星 解题报告

    P3349 [ZJOI2016]小星星 题目描述 小\(Y\)是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有\(n\)颗小星星,用\(m\)条彩色的细线串了起来,每条细线连着两颗小星星. 有一 ...

  2. 【题解】P3349 [ZJOI2016]小星星 - 子集dp - 容斥

    P3349 [ZJOI2016]小星星 声明:本博客所有题解都参照了网络资料或其他博客,仅为博主想加深理解而写,如有疑问欢迎与博主讨论✧。٩(ˊᗜˋ)و✧*。 题目描述 小 \(Y\) 是一个心灵手巧 ...

  3. 【题解】Luogu P3349 [ZJOI2016]小星星

    原题传送门 我们考虑设\(dp_{i,j}\)表示树上的点\(i\)在图上对应的点为\(j\)时\(i\)和子树对应在图上的方案数 \(dp_{u_i}=\prod_{v \in u.son} dp_ ...

  4. ZJOI2016 小星星 题解

    我一生之敌是状压 本文发表于 洛谷博客:https://www.luogu.com.cn/blog/LoveMC/solution-p3349 Cnblogs:https://www.cnblogs. ...

  5. BZOJ 4455: [Zjoi2016]小星星 [容斥原理 树形DP]

    4455: [Zjoi2016]小星星 题意:一个图删掉一些边形成一棵树,告诉你图和树的样子,求让图上的点和树上的点对应起来有多少方案 看了很多题解又想了一段时间,感觉题解都没有很深入,现在大致有了自 ...

  6. 4455[Zjoi2016]小星星 容斥+dp

    4455: [Zjoi2016]小星星 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 527  Solved: 317[Submit][Status] ...

  7. [ZJOI2016]小星星&[SHOI2016]黑暗前的幻想乡(容斥)

    这两道题思路比较像,所以把他们放到一块. [ZJOI2016]小星星 题目描述 小Y是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有n颗小星星,用m条彩色的细线串了起来,每条细线连着两颗小星星. ...

  8. 【BZOJ 4455】 4455: [Zjoi2016]小星星 (容斥原理+树形DP)

    4455: [Zjoi2016]小星星 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 426  Solved: 255 Description 小Y是 ...

  9. bzoj 4455 [Zjoi2016]小星星 树形dp&容斥

    4455: [Zjoi2016]小星星 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 643  Solved: 391[Submit][Status] ...

随机推荐

  1. 学习使用windows下类似iptables的防火墙软件

    项目地址:http://wipfw.sourceforge.net一.下载地址:http://sourceforge.net/projects/wipfw/files/安装:解压软件包后执行insta ...

  2. The Java library for converting Wikipedia wikitext notation to HTML

    https://code.google.com/p/gwtwiki/ The Java Wikipedia API (Bliki engine) is a parser library for con ...

  3. 记一次springMVC的跨域解决方案

    日期:2019年5月18日 事情原因:由于微信小程序的开发只有测试环境,而后台提供借口的环境是开发环境:两个环境的域名不同,导致前端开发产生了跨域问题: 理论概念: 1.同源策略:同源策略是浏览器的安 ...

  4. [GraphQL] Query Local and Remote Data in Apollo Link State

    In this lesson, you will learn how to query local and remote data in Apollo Link State in the same c ...

  5. swift编程语言基础教程 中文版

    swift编程语言基础教程 中文版 http://download.csdn.net/detail/u014036026/7845491

  6. python批量删除文件

    敲代码測试时总会碰到要删除日志目录下的日志或者删除一些历史文件.每次都会生成,再測试的时候为了查找错误原因方便总是要在測试前删除这些文件.手动删除比較麻烦.所以写一个批量删除脚本 import os ...

  7. ZOJ - 3471 Most Powerful (状态压缩)

    题目大意:有n种原子,两种原子相碰撞的话就会产生能量,当中的一种原子会消失. 问这n种原子能产生的能量最大是多少 解题思路:用0表示该原子还没消失.1表示该原子已经消失.那么就能够得到状态转移方程了 ...

  8. Android关于Task的一些实践之SingleTask, SingleInstance和TaskAffinity

    上一篇文章粗略地介绍了一下关于Android中Task的基本知识.只是实践才是检验真理的唯一标准,所以.今天就来试验一下Task中的launchMode是否真的实现了文档所说的那样. 首先.定义三个A ...

  9. js jquery验证上传文件的格式和大小

    // 验证附件格式和大小 function confirmData() { var flag = true; var message = ""; var errorSize = & ...

  10. js全局替换空格,制表符,换行符

    this.value = this.value.replace(/\s+/g,'') "/ "这个是固定写法, "\s"匹配任何不可见字符,包括空格.制表符.换 ...