#185. 【ZJOI2016】小星星

小Y是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品。她有 nn 颗小星星,用 mm 条彩色的细线串了起来,每条细线连着两颗小星星。有一天她发现,她的饰品被破坏了,很多细线都被拆掉了。这个饰品只剩下了 n−1n−1 条细线,但通过这些细线,这颗小星星还是被串在一起,也就是这些小星星通过这些细线形成了树。

小Y找到了这个饰品的设计图纸,她想知道现在饰品中的小星星对应着原来图纸上的哪些小星星。如果现在饰品中两颗小星星有细线相连,那么要求对应的小星星原来的图纸上也有细线相连。

小Y想知道有多少种可能的对应方式。只有你告诉了她正确的答案,她才会把小饰品做为礼物送给你呢。

输入格式

第一行包含个 22 正整数 n,mn,m ,表示原来的饰品中小星星的个数和细线的条数。

接下来 mm 行,每行包含 22 个正整数 u,vu,v,表示原来的饰品中小星星 uu 和 vv 通过细线连了起来。这里的小星星从 11 开始标号。保证 u≠vu≠v,且每对小星星之间最多只有一条细线相连。

接下来行 n−1n−1,每行包含个 22 正整数 u,vu,v,表示现在的饰品中小星星 uu 和 vv 通过细线连了起来。保证这些小星星通过细线可以串在一起。

输出格式

输出共 11 行,包含一个整数表示可能的对应方式的数量。如果不存在可行的对应方式则输出 00。

样例一

input

4 3
1 2
1 3
1 4
4 1
4 2
4 3

output

6

explanation

现在的饰品中第 44 颗小星星与原来的第 11 颗对应,现在的第 1,2,31,2,3 颗小星星可以与原来的第 2,3,42,3,4 颗小星星对应,所以有 66 种对应方式。

样例二

见样例数据下载。

限制与约定

各测试点满足以下约定:

测试点 nn mm 约定
1 =10=10 ≤n(n−1)2≤n(n−1)2
2
3 =17=17 保证新的饰品中每颗小星星与至多两颗小星星相连
4
5 =14=14
6
7 =16=16 保证答案不超过 105105
8
9 =17=17
10

时间限制:1s1s

空间限制:512MB

/*
dp[i][j]表示以i为根的子树并且i对应原图的j的方案数
为避免同一个节点在树上映射多次,用容斥原理处理答案
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 30
using namespace std;
int n,m,cnt,bin[maxn],head[maxn],a[maxn],num;
long long dp[maxn][maxn];
bool mp[maxn][maxn];
struct node{int to,pre;}e[maxn*];
void Insert(int from,int to){
e[++num].to=to;
e[num].pre=head[from];
head[from]=num;
}
void dfs(int now,int father){
long long tmp;
for(int i=head[now];i;i=e[i].pre){
int to=e[i].to;
if(to!=father)dfs(to,now);
}
for(int i=;i<=cnt;i++){
dp[now][i]=;
for(int j=head[now];j;j=e[j].pre){
int to=e[j].to;
tmp=;
if(to==father)continue;
for(int k=;k<=cnt;k++)
if(mp[a[i]][a[k]])tmp+=dp[to][k];
dp[now][i]*=tmp;
if(!dp[now][i])break;
}
}
}
int main(){
scanf("%d%d",&n,&m);
int x,y;long long ans=,sum=;
bin[]=;for(int i=;i<=n;i++)bin[i]=bin[i-]<<;
for(int i=;i<=m;i++){
scanf("%d%d",&x,&y);
mp[x][y]=mp[y][x]=;
}
for(int i=;i<n;i++){
scanf("%d%d",&x,&y);
Insert(x,y);Insert(y,x);
}
for(int i=;i<bin[n];i++){
sum=cnt=;
for(int j=;j<=n;j++)if(i&bin[j-])a[++cnt]=j;
dfs(,);
for(int j=;j<=cnt;j++)sum+=dp[][j];
if((cnt^n)&)ans-=sum;else ans+=sum;
}
cout<<ans;
return ;
}

uoj #185. 【ZJOI2016】小星星的更多相关文章

  1. ZJOI2016 小星星 题解

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. UOJ #185【ZJOI2016】 小星星

    题目链接:小星星 首先有个暴力很好想.令\(f_{i,j,S}\)表示把\(i\)这棵子树对应到原图中的\(S\)集合,\(i\)号点对应到了\(j\)号点的方案数.这玩意儿复杂度是\(O(3^nn^ ...

随机推荐

  1. 使用JQuery,动态增加列

    这也是我在自己学做网站时无意搞出来的,希望可以对别人有所启发 <%@ page language="java" import="java.util.*" ...

  2. java是用utf-16be编码方式编的。中文和英文都是两个字节

  3. VScode 为 *.cu文件 添加高亮及c++ intelligence相关操作的方法

    问题:*.cu在VScode不能像*.cc或*.cpp一样在c++及c++ intelligence插件有关键字的高亮以及go to definition等的操作 解决方案:添加*.cu与*.cpp文 ...

  4. innerdb disable error

    innodb=OFF ignore-builtin-innodb skip-innodbdefault-storage-engine=myisam default-tmp-storage-engine ...

  5. 【C/C++】scanf,printf 函数

    摘自http://www.cplusplus.com 1. scanf 函数 int scanf ( const char * format, ... ); Parameters format C s ...

  6. javascript中eval()函数使用方法

    本教程主要重介绍eval()函数的语法与使用方法,及在后面我还补充了eval()解析json数据的相关例子,希望文章能帮助到各位深入理解eval()使用方法吧.   前几天说到js中尽量不要使用eva ...

  7. 非系统数据文件损坏,rman备份恢复

    实验前提:已经做好备份. SQL> col file_name for a50select file_id,file_name from dba_data_files; FILE_ID FILE ...

  8. java用write()拷贝一个文本文件

    总结:灵活运用循环语句,或条件判断语句.每一种流的正确使用方法: 这里是两种方法: package com.ds; import java.io.*; public class tyut { /*pu ...

  9. python的gzip库使用方法

    解压gzip文件示例: import gzip f = gzip.open('file.txt.gz', 'rb') file_content = f.read() f.close() 创建gzip文 ...

  10. iconv字符转换

    iconv是linux下的编码转换的工具,它提供命令行的使用和函数接口支持 函数接口 iconv函数族的头文件是iconv.h,使用前需包含之.#include <iconv.h> ico ...