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

时间:2022-07-28 14:00:46

4455: [Zjoi2016]小星星

Time Limit: 10 Sec  Memory Limit: 512 MB
Submit: 426  Solved: 255

Description

小Y是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品。她有n颗小星星,用m条彩色的细线串了起来,每条细
线连着两颗小星星。有一天她发现,她的饰品被破坏了,很多细线都被拆掉了。这个饰品只剩下了n?1条细线,但
通过这些细线,这颗小星星还是被串在一起,也就是这些小星星通过这些细线形成了树。小Y找到了这个饰品的设
计图纸,她想知道现在饰品中的小星星对应着原来图纸上的哪些小星星。如果现在饰品中两颗小星星有细线相连,
那么要求对应的小星星原来的图纸上也有细线相连。小Y想知道有多少种可能的对应方式。只有你告诉了她正确的
答案,她才会把小饰品做为礼物送给你呢。

Input

第一行包含个2正整数n,m,表示原来的饰品中小星星的个数和细线的条数。
接下来m行,每行包含2个正整数u,v,表示原来的饰品中小星星u和v通过细线连了起来。
这里的小星星从1开始标号。保证u≠v,且每对小星星之间最多只有一条细线相连。
接下来n-1行,每行包含个2正整数u,v,表示现在的饰品中小星星u和v通过细线连了起来。
保证这些小星星通过细线可以串在一起。
n<=17,m<=n*(n-1)/2

Output

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

Sample Input

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

Sample Output

6

HINT

Source

 
【分析】
  很久之前的比赛的一题。【好题啊但是我为什么没有写题解?
  先不考虑每个点一一对应的话,对应关系正确当且仅当树上有的边,对应到原来的无向图上的边也有。
  f[x][i]表示x这个点对应i这个点的情况下,x这棵子树的对应关系正确的方案数。
  这个树形DP即可,n^3。
  但是要保证一一对应,那么可能有一些点没有被对应,所以用容斥。
  枚举没有对应的点,若为奇则减,为偶则加。
  【记得好像不用边目录会T?
  【好像这种“恰好”或者“一一对应”的题目都很经常用容斥,你不能保证要保证的东西,容斥一下就会变得简单
 
 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define INF 0xfffffff
#define Maxn 20
#define LL long long bool c[Maxn][Maxn];
int fa[Maxn],first[Maxn]; int n,m; struct node
{
int x,y,next;
}t[*Maxn];int len; void ins(int x,int y)
{
t[++len].x=x;t[len].y=y;
t[len].next=first[x];first[x]=len;
} void dfs(int x,int f)
{
fa[x]=f;
for(int i=first[x];i;i=t[i].next) if(t[i].y!=f)
{
dfs(t[i].y,x);
}
} LL f[Maxn][Maxn]; void get_f(int x,int s)
{
for(int i=first[x];i;i=t[i].next) if(t[i].y!=fa[x])
{
get_f(t[i].y,s);
}
for(int i=;i<=n;i++) if(((<<i-)&s)==)
{
f[x][i]=;
for(int j=first[x];j;j=t[j].next) if(t[j].y!=fa[x])
{
LL now=;
int y=t[j].y;
for(int k=;k<=n;k++) if(c[i][k])
{
now+=f[y][k];
}
f[x][i]*=now;
}
}
else f[x][i]=;
} int main()
{
memset(c,,sizeof(c));
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
c[x][y]=c[y][x]=;
}
memset(first,,sizeof(first));
for(int i=;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
ins(x,y);ins(y,x);
}
dfs(,);
int mx=(<<n)-;
LL ans=;
for(int i=;i<=mx;i++)
{
// memset(f,0,sizeof(f));
get_f(,i);
int h=,now=i;
LL sum=;
while(now)
{
if(now&) h++;
now/=;
}
for(int j=;j<=n;j++) sum+=f[][j];
if(h%==) ans+=sum;
else ans-=sum;
}
// memset(f,0,sizeof(f));
get_f(,);
for(int j=;j<=n;j++) ans+=f[][j];
printf("%lld\n",ans);
return ;
}

2017-04-20 17:23:11

【BZOJ 4455】 4455: [Zjoi2016]小星星 (容斥原理+树形DP)的更多相关文章

  1. BZOJ 4455&colon; &lbrack;Zjoi2016&rsqb;小星星 &lbrack;容斥原理 树形DP&rsqb;

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

  2. bzoj4455 &amp&semi; loj2091 &lbrack;Zjoi2016&rsqb;小星星 容斥原理&plus;树形DP&lpar;&plus;状压DP&quest;&rpar;

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4455 https://loj.ac/problem/2091 题解 很不错的一道题.(不过在当 ...

  3. 4455&lbrack;Zjoi2016&rsqb;小星星 容斥&plus;dp

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

  4. BZOJ4455 ZJOI2016小星星(容斥原理&plus;树形dp)

    相当于给树上的每个点分配一个编号使父亲和儿子间都有连边. 于是可以考虑树形dp:设f[i][j][k]为i号点的编号为j,其子树中编号集合为k的方案数.转移显然.然而复杂度3n·n3左右,具体我也不知 ...

  5. BZOJ&period;3227&period;&lbrack;SDOI2008&rsqb;红黑树tree&lpar;树形DP 思路&rpar;

    BZOJ orz MilkyWay天天做sxt! 首先可以树形DP:\(f[i][j][0/1]\)表示\(i\)个点的子树中,黑高度为\(j\),根节点为红/黑节点的最小红节点数(最大同理). 转移 ...

  6. BZOJ&period;2286&period;&lbrack;SDOI2011&rsqb;消耗战&lpar;虚树 树形DP&rpar;

    题目链接 BZOJ 洛谷P2495 树形DP,对于每棵子树要么逐个删除其中要删除的边,要么直接断连向父节点的边. 如果当前点需要删除,那么直接断不需要再管子树. 复杂度O(m*n). 对于两个要删除的 ...

  7. bzoj 1060 &lbrack;ZJOI2007&rsqb;时态同步(树形DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1060 [题意] 求最少的增加量,使得以rt为根的树中由一个结点出发的所有到叶子结点的路 ...

  8. BZOJ 1509&colon; &lbrack;NOI2003&rsqb;逃学的小孩&lpar; 树形dp &rpar;

    树形dp求出某个点的最长3条链a,b,c(a>=b>=c), 然后以这个点为交点的最优解一定是a+2b+c.好像还有一种做法是求出树的直径然后乱搞... ----------------- ...

  9. BZOJ&period;3238&period;&lbrack;AHOI2013&rsqb;差异&lpar;后缀自动机 树形DP&sol;后缀数组 单调栈&rpar;

    题目链接 \(Description\) \(Solution\) len(Ti)+len(Tj)可以直接算出来,每个小于n的长度会被计算n-1次. \[\sum_{i=1}^n\sum_{j=i+1 ...

随机推荐

  1. 极客DIY:廉价电视棒玩转GNSS-SDR,实现GPS实时定位

    0×00 前言 GNSS是Global Navigation Satellite System的缩写.中文称作:全球卫星导航系统.全球导航卫星系统. GNSS泛指所有的卫星导航系统,包括全球的.区域的 ...

  2. java简单实现季节,性别分词处理

    淘宝里面,每个宝贝都有一个标题,根据标题来分词,区分出季节和性别,分别写了两个方法,供大家参考. public int season(String str) { String dest = &quot ...

  3. DirectFB环境搭建

    一.下载安装包 http://www.directfb.org/index.php?path=Main%2FDownloads git clone git://git.directfb.org/git ...

  4. react native 中时间选择插件

    npm install react-native-datepicker --save import DatePicker from 'react-native-datepicker'; <Vie ...

  5. woff字体MIME类型配置

    <system.webServer> <staticContent> <remove fileExtension=".woff" /> < ...

  6. 用Physijs在场景中添加物理效果

    1.创建可用Physijs的基本Three.js场景 创建一个可用Physijs的Three.js场景非常简单,只要几个步骤即可.首先我们要包含正确的文件, 需要引入physi.js文件.实际模拟物理 ...

  7. this是什么!

    this 1.js的关键字指定一个对象,然后去替代他 函数内的this    函数外的this 函数内的this指向行为发生的主体 函数外的this都指向window 2.函数内的this和函数在什么 ...

  8. 安装fastdfs文件系统

    1.下载源码包 需要下载的源码包: fastDFS源代码:FastDFS_v5.01.tar.gz fastDFS的nginx模块源代码:fastdfs-nginx-module_v1.15.tar. ...

  9. 2015-07学习总结——网络编程(TCP&sol;IP)

    之前学习的主要内容是单机上的处理,比如编程语言.游戏编程.数据库.多媒体编解码.其实对网络也有些接触,比如WWW.HTTP.UDP/TCP.RTP.RTMP.SNMP.FTP.单播组播.Telnet. ...

  10. URAL 1748

    题目大意:找出T组不大于ni(i=1,2,3,...,T)的因子数最多的数mi(i=1,2,3,...,T),有多个数时输出最小的. KB     64bit IO Format:%I64d &amp ...