uoj #185. 【ZJOI2016】小星星
#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】小星星的更多相关文章
- ZJOI2016 小星星 题解
我一生之敌是状压 本文发表于 洛谷博客:https://www.luogu.com.cn/blog/LoveMC/solution-p3349 Cnblogs:https://www.cnblogs. ...
- BZOJ 4455: [Zjoi2016]小星星 [容斥原理 树形DP]
4455: [Zjoi2016]小星星 题意:一个图删掉一些边形成一棵树,告诉你图和树的样子,求让图上的点和树上的点对应起来有多少方案 看了很多题解又想了一段时间,感觉题解都没有很深入,现在大致有了自 ...
- 4455[Zjoi2016]小星星 容斥+dp
4455: [Zjoi2016]小星星 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 527 Solved: 317[Submit][Status] ...
- [ZJOI2016]小星星&[SHOI2016]黑暗前的幻想乡(容斥)
这两道题思路比较像,所以把他们放到一块. [ZJOI2016]小星星 题目描述 小Y是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有n颗小星星,用m条彩色的细线串了起来,每条细线连着两颗小星星. ...
- 【BZOJ 4455】 4455: [Zjoi2016]小星星 (容斥原理+树形DP)
4455: [Zjoi2016]小星星 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 426 Solved: 255 Description 小Y是 ...
- 洛谷 P3349 [ZJOI2016]小星星 解题报告
P3349 [ZJOI2016]小星星 题目描述 小\(Y\)是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有\(n\)颗小星星,用\(m\)条彩色的细线串了起来,每条细线连着两颗小星星. 有一 ...
- bzoj 4455 [Zjoi2016]小星星 树形dp&容斥
4455: [Zjoi2016]小星星 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 643 Solved: 391[Submit][Status] ...
- 【题解】P3349 [ZJOI2016]小星星 - 子集dp - 容斥
P3349 [ZJOI2016]小星星 声明:本博客所有题解都参照了网络资料或其他博客,仅为博主想加深理解而写,如有疑问欢迎与博主讨论✧。٩(ˊᗜˋ)و✧*。 题目描述 小 \(Y\) 是一个心灵手巧 ...
- UOJ #185【ZJOI2016】 小星星
题目链接:小星星 首先有个暴力很好想.令\(f_{i,j,S}\)表示把\(i\)这棵子树对应到原图中的\(S\)集合,\(i\)号点对应到了\(j\)号点的方案数.这玩意儿复杂度是\(O(3^nn^ ...
随机推荐
- Wrong Answer,Memory Limit Exceeded
错误原因: 1.在递归的时候,递归函数中忘记加返回return. 1.1做题时遇到一个奇葩错误,把它记到这里,看代码: 代码1:错误,用c++提交wrong answer,但是用g++提交却accep ...
- php 二维数组验证一个值是否存在
php 判断数字在二维数组里 $arr = array( array('a', 'b'), array('c', 'd') ); in_array('a', $arr); // 此时返回的永远都是 f ...
- 动态规划 最长回文子串 leetcode5
public static String longestPalindrome(String s) { if(null==s||s.length()==0) return s; int n=s.leng ...
- codeforces 631C C. Report
C. Report time limit per test 2 seconds memory limit per test 256 megabytes input standard input out ...
- RouterOS(ROS)简单限速/单IP限速脚
暂无评论 有时企业环境,或个人使用环境需要针对不同IP设置较多条不同限速,可以使用以下脚本批量处理后,再针对性的修改. *脚本说明:“2 to 254”定义要设置受限IP的起始,后面“192.168. ...
- 浅谈java中replace()和replaceAll()的区别
replace和replaceAll是JAVA中常用的替换字符的方法,它们的区别是: 1)replace的参数是char和CharSequence,即可以支持字符的替换,也支持字符串的替换(CharS ...
- Hihocoder1662 : 查找三阶幻方([Offer收割]编程练习赛40)(暴力)
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个N x M的矩阵,请你数一数其中有多少个3 x 3的子矩阵可以构成三阶幻方? 如果3 x 3的矩阵中每一行.每一列 ...
- TYVJ 1094 矩形分割
时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 YHOI Train#4 Problem 1 描述 出于某些方面的需求,我们要把一块N×M的木板切成一个个1× ...
- [转]django 日志logging的配置以及处理
http://davidbj.blog.51cto.com/4159484/1433741 日志在程序开发中是少不了的,通过日志我们可以分析到错误在什么地方,有什么异常.在生产环境下有很大的用途.在J ...
- 深入V8引擎-枚举+位运算实现参数配置
不知不觉都快月底了,看了看上一篇还是6号写的,惭愧惭愧,说好的坚持.为了证明没有偷懒(其实还是沉迷了一会dota2),先上一个图自证清白. 基本上从初始化引擎,到Isolate.handleScope ...