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^ ...
随机推荐
- Python with MYSQL - sytax problem
Con= MySQLdb.connect(host=',db='test') cur=Con.cursor() cur.execute('insert into staff_daily(Date,Na ...
- Java微信开发_Exception_01_The type org.xmlpull.v1.XmlPullParser cannot be resolved. It is indirectly referenced from required .class files
一.源码: package com.souvc.weixin.util; import java.io.InputStream; import java.io.Writer; import java. ...
- Mybatis异常_01_Invalid bound statement (not found)
异常信息:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.taotao.map ...
- LeetCode 510. Inorder Successor in BST II
原题链接在这里:https://leetcode.com/problems/inorder-successor-in-bst-ii/ 题目: Given a binary search tree an ...
- bzoj 2510: 弱题 概率期望dp+循环矩阵
题目: Description 有M个球,一开始每个球均有一个初始标号,标号范围为1-N且为整数,标号为i的球有ai个,并保证Σai = M. 每次操作等概率取出一个球(即取出每个球的概率均为1/M) ...
- 【LeetCode】020. Valid Parentheses
Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the inpu ...
- 【算法总结】Manacher's Algorithm
Manacher's Algorithm针对的是最长回文子串问题.对于此问题,最直接的方法是遍历每一个元素,遍历过程中以每一个字符为中心向两边扩展以寻找此字符为中心的最长回文子串.复杂度O(n2).M ...
- DNSmasq
是一款轻便的主要用于个人电脑的DNS:占用的端口是53(和DNS服务的bind的端口一致):我之所以关注它,就是因为在安装DCOS的时候是不允许占用53端口:但是其实默认安装的CentOS几乎都有这个 ...
- Poj1062 昂贵的聘礼 (dijkstra算法)
一.Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长 ...
- mina中的发送延时
由于项目需要,用到了 mina 框架进行 tcp 通讯.我是初次接触 mina,于是从 Hello world 开始学习了 mina .期间遇到了一个奇怪的发送数据的延迟问题,解决的过程是曲折的,但找 ...