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^ ...
随机推荐
- 内存表 ClientDataSet CreateDataSet
unit Form_Main; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, F ...
- shingling算法——提取特征,m个hash函数做指纹计算,针对特征hash后变成m维向量,最后利用union-find算法计算相似性
shingling算法用于计算两个文档的相似度,例如,用于网页去重.维基百科对w-shingling的定义如下: In natural language processing a w-shinglin ...
- C语言小程序(三)、判断两个日期之差
输入两个日期,计算之间相差多少天. 用了两种方法实现,第二种利用结构体,代码比较清晰,其余的都一样. 1.普通的写法 #include <stdio.h> int leapyear(int ...
- Python Class 的实例方法/类方法/静态方法
实例方法.类方法.静态方法 class MyClass(object): class_name = "MyClass" # 类属性, 三种方法都能调用 def __init__(s ...
- DEBUG命令说明
Debug在学习汇编的过程中,担任着一个非常重要的角色,是一个极其重要的调试工具,所以学会它是必须得. 命令格式 功能说明 A [地址] 输入汇编指令 C [范围] 起始地址 对由“范围”指定的区域与 ...
- yeoman,grunt,bower
Yeoman主要有三部分组成:yo(脚手架工具).grunt(构建工具).bower(包管理器).这三个工具是分别独立开发的,但是需要配合使用,来实现我们高效的工作流模式. http://www.cn ...
- BZOJ1657:[USACO2006MAR]Mooo
浅谈栈:https://www.cnblogs.com/AKMer/p/10278222.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php?id ...
- 找工作--volatile
在Java编写的程序中,有时为了提高程序的运行效率,编译器会自动对其进行优化,把经常访问的变量缓存起来,程序在读取这个变量时有可能会直接从缓存(例如寄存器)中来读取这个值,而不会从内存中读取.这样做的 ...
- flume入门之一:flume 安装及测试
http://flume.apache.org/ flume下载:http://mirror.bit.edu.cn/apache/flume/1.7.0/apache-flume-1.7.0-bin. ...
- ng2-升级脚手架到最新版本
//先卸载,后安装 npm uninstall -g @angular/cli npm cache clean npm install -g @angular/cli@latest