传送门

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

题意就是求一个从树\(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;
}

最新文章

  1. Xcode 提高效率的几个快捷键
  2. echarts
  3. 标准IO的简单应用,动静态库,读取系统时间并打印,模拟ls -l功能
  4. 【NOIP提高组2015D2T1】uva 714 copying books【二分答案】——yhx
  5. 数据库性能之--ibatis cache应用
  6. Chapter13:拷贝控制
  7. 练习PYTHON协程之GREENLET
  8. 用css实现3D立方体旋转特效
  9. [转载] 从Hadoop到Spark的架构实践
  10. C/C++中如何接收return返回来的数组元素
  11. MySQL主从复制-xtrabackup的使用与延时复制(附原理图)
  12. python 单行写法
  13. gcc 无法编译c17程序解决办法
  14. 01Spark的TopN问题
  15. Hadoop概念学习系列之Java调用Shell命令和脚本,致力于hadoop/spark集群(三十六)
  16. android沉浸状态栏和顶部状态栏背景色的设置
  17. 小朋友学C++(2)
  18. 如何在Mirth Connect中创建和调用自定义Java代码
  19. 【DP】CF859C Pie Rules
  20. LoadRunner监控Linux资源

热门文章

  1. 九度oj 题目1203:IP地址
  2. 数据结构-B+树
  3. 一个WebLoad 脚本范例
  4. java springMVC 极致验证 非demo版
  5. uva10537 最短路 倒推
  6. UVA 116_ Unidirectional TSP
  7. SAS编程基础 - 菜鸟入门常用操作
  8. 如何快速掌握plc或工控机与其他设备的modbus通讯协议?包括格式与实际过程 RT,本人从事工控行业多年,对于PLC与触摸屏也算比较熟悉,唯独对这个通讯协议比较难理解,请教高人指导,从什么地方开始下手,或者是说如何正确理解报文格式或正确写入
  9. windows 7 忘記密碼,用“带命令行的安全模式”
  10. Markdown 语法的简要规则