【题解】Luogu P3349 [ZJOI2016]小星星
原题传送门
我们考虑设\(dp_{i,j}\)表示树上的点\(i\)在图上对应的点为\(j\)时\(i\)和子树对应在图上的方案数
\(dp_{u_i}=\prod_{v \in u.son} dp_{v,j}*w[i][j]\)(w[i][j]表示在图中\(i\)和\(j\)是否连通)
这个dp的复杂度是\(O(n^3)\),但是会发现它会多算答案,因为这个算法有可能会将多个树上的点对应到一个图上的点
我们珂以二进制枚举,枚举哪些图上的点参与dp,按照容斥原理加减,这样就珂以算出答案,复杂度为\(O(2^n n^3)\)
#include <bits/stdc++.h>
#define ll long long
#define N 20
#define getchar nc
using namespace std;
inline char nc(){
    static char buf[100000],*p1=buf,*p2=buf;
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline int read()
{
    register int x=0,f=1;register char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
    return x*f;
}
inline void write(register ll x)
{
    if(!x)putchar('0');if(x<0)x=-x,putchar('-');
    static int sta[20];register int tot=0;
    while(x)sta[tot++]=x%10,x/=10;
    while(tot)putchar(sta[--tot]+48);
}
struct edge{
    int to,next;
}e[N<<1];
int head[N],cnt=0;
inline void add(register int u,register int v)
{
    e[++cnt]=(edge){v,head[u]};
    head[u]=cnt;
}
int n,m,w[N][N],ban[N],vis[N];
ll f[N][N],ans;
inline void dfs(register int x)
{
    vis[x]=1;
    for(register int i=1;i<=n;++i)
        f[x][i]=1;
    for(register int i=head[x];i;i=e[i].next)
    {
        int v=e[i].to;
        if(vis[v])
            continue;
        dfs(v);
        for(register int j=1;j<=n;++j)
        {
            ll sum=0;
            for(register int k=1;k<=n;++k)
                sum+=f[v][k]*(w[k][j]&ban[k]&ban[j]);
            f[x][j]*=sum;
        }
    }
}
int main()
{
    n=read(),m=read();
    for(register int i=1;i<=m;++i)
    {
        int u=read(),v=read();
        w[u][v]=w[v][u]=1;
    }
    for(register int i=1;i<n;++i)
    {
        int u=read(),v=read();
        add(u,v),add(v,u);
    }
    for(register int k=1,siz;k<=(1<<n)-1;++k)
    {
        siz=n;
        for(register int i=1;i<=n;++i)
            ban[i]=0;
        for(register int i=1,p=k;p;p>>=1,++i)
            ban[i]=p&1,siz-=p&1;
        for(register int i=1;i<=n;++i)
            vis[i]=0;
        dfs(1);
        ll cnt=0;
        for(register int i=1;i<=n;++i)
            cnt+=f[1][i];
        if(siz%2)
            ans-=cnt;
        else
            ans+=cnt;
    }
    write(ans);
	return 0;
}
												
											【题解】Luogu P3349 [ZJOI2016]小星星的更多相关文章
- 【题解】P3349 [ZJOI2016]小星星 - 子集dp - 容斥
		
P3349 [ZJOI2016]小星星 声明:本博客所有题解都参照了网络资料或其他博客,仅为博主想加深理解而写,如有疑问欢迎与博主讨论✧。٩(ˊᗜˋ)و✧*。 题目描述 小 \(Y\) 是一个心灵手巧 ...
 - 洛谷 P3349 [ZJOI2016]小星星 解题报告
		
P3349 [ZJOI2016]小星星 题目描述 小\(Y\)是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有\(n\)颗小星星,用\(m\)条彩色的细线串了起来,每条细线连着两颗小星星. 有一 ...
 - P3349 [ZJOI2016]小星星
		
传送门 题意都需要看题解才能明白我是不是已经废了 题意就是求一个从树\(S\)到图\(T\)的映射,满足若树上的两个点有边,则它们映射在图中的两个点也连有边,且不能有多个点映射到同一个点 我们先不考虑 ...
 - 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是 ...
 - bzoj 4455 [Zjoi2016]小星星 树形dp&容斥
		
4455: [Zjoi2016]小星星 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 643 Solved: 391[Submit][Status] ...
 
随机推荐
- .NET Core中 实现H5微信登录(静默授权方式)
			
需求 假设现在有一个H5需要有微信登录.手机号登录.邮箱登录 三种登录方式.让我们一起来看看微信登录如何实现吧 界面: 最终实现的效果图(登录成功后返回个人页): 因为微信登录目前没有实现移动端的其他 ...
 - 简单几招提速 Kotlin Kapt编译
			
https://droidyue.com/blog/2019/08/18/faster-kapt/?hmsr=toutiao.io&utm_medium=toutiao.io&utm_ ...
 - 个人项目  python实现
			
一. github地址:https://github.com/zjh1234562/WC 二 . PSP表格 PSP2.1 Personal Software Process Stages 预估耗时 ...
 - Vue组件间通信6种方式
			
摘要: 总有一款合适的通信方式. 作者:浪里行舟 Fundebug经授权转载,版权归原作者所有. 前言 组件是 vue.js 最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的 ...
 - Java常用关键字的原理及用法
			
转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10843135.html 一:transient 用途:Java中一个类在定义时如果实现了Serilizabl ...
 - ubuntu安装vbox虚拟机
			
ubuntu安装vbox虚拟机 一.安装准备 1.查看主机配置 二.下载安装包 (建议将安装包下载并保存) a.下载virtualbox安装包 下载链接https://www.virtualbo ...
 - @TableName(mybatis-plus中的注解)
			
@TableName 描述:表名注解 属性 类型 必须指定 默认值 描述 value String 否 "" 表名 schema String 否 "" sch ...
 - linux 指定用户 启动 程序
			
sudo -H -u {username} /bin/bash -c "python test.py &" "&" 后台运行指令 本人亲测可用 ...
 - Kubernetes 资源对象
			
概述 我将它们简单的分类为以下几种资源对象: 类别 名称 资源对象 Pod.ReplicaSet.ReplicationController.Deployment.StatefulSet.Daemon ...
 - uniapp增加百度统计代码(h5)
			
做了个微信公众号文章互相阅读的h5界面,http://mptask.wintp.top/(只能微信浏览器打开),其中用到了统计代码,记录如下. 1.新建 tj.html 界面 可放置在项目的根目录,文 ...