【BZOJ4455】小星星(动态规划,容斥)
【BZOJ4455】小星星(动态规划,容斥)
题面
题解
题意说简单点就是给定一张\(n\)个点的图和一棵\(n\)个点的树,现在要让图和树之间的点一一对应,并且如果树上存在一条边,那么图上对应的点对之间也要存在边。
我们直接求解显然很麻烦,一一对应是一个很不好算的东西。
那么我们先要求并不需要一一对应,随意对应即可,最后再减掉不合法的方案,这样就可以用容斥来解决。
怎么容斥呢?无非是考虑没有一一对应的关系,那么我们先暴力枚举一下哪些点在图上可以和树上的点进行对应,其他的点不能够和树上的点进行匹配。
那么考虑\(dp\)计算方案数。
设\(f[i][j]\)表示当前以\(i\)为根的子树(假装以\(1\)号点为根节点的有根树),并且\(i\)在图上对应的点是\(j\)的方案数。
每次暴力选择一个和当前\(i\)匹配的点,然后再暴力找到这个点在图中的所有儿子,并且用子树进行转移,这样\(dp\)一次的复杂度是\(O(n\times n\times n)\),即树上每个点都要做一次,要暴力枚举和哪个点进行匹配,还需要暴力枚举儿子是哪个点,当然这样肯定不满。
再加上暴力枚举可以进行匹配的点集的枚举,
所以总的时间复杂度是\(O(n^32^n)\)
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define ll long long
#define MAX 20
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
struct Line{int v,next;}e1[MAX*MAX<<1],e2[MAX<<1];
int h1[MAX],h2[MAX];
int cnt1=1,cnt2=1;
int n,m,cnt,a[MAX];
inline void Add1(int u,int v){e1[cnt1]=(Line){v,h1[u]};h1[u]=cnt1++;}
inline void Add2(int u,int v){e2[cnt2]=(Line){v,h2[u]};h2[u]=cnt2++;}
ll f[MAX][MAX],ans=0,num;
void dfs(int u,int ff)
{
for(int i=h2[u];i;i=e2[i].next)
if(e2[i].v!=ff)dfs(e2[i].v,u);
for(int i=1;i<=cnt;++i)//枚举当前点得到匹配点
{
f[u][a[i]]=1;
for(int j=h2[u];j;j=e2[j].next)
if(e2[j].v!=ff)
{
num=0;
for(int k=h1[a[i]];k;k=e1[k].next)num+=f[e2[j].v][e1[k].v];
f[u][a[i]]*=num;
if(!f[u][a[i]])break;
}
}
}
int main()
{
n=read();m=read();
for(int i=1,u,v;i<=m;++i)u=read(),v=read(),Add1(u,v),Add1(v,u);
for(int i=2,u,v;i<=n;++i)u=read(),v=read(),Add2(u,v),Add2(v,u);
for(int i=1;i<(1<<n);++i)//枚举可以进行匹配的点集
{
cnt=0;memset(f,0,sizeof(f));
for(int j=0;j<n;++j)if(i&(1<<j))a[++cnt]=j+1;
dfs(1,0);num=0;
for(int j=1;j<=cnt;++j)num+=f[1][a[j]];
if((n-cnt)&1)ans-=num;else ans+=num;
}
printf("%lld\n",ans);
return 0;
}
【BZOJ4455】小星星(动态规划,容斥)的更多相关文章
- 【BZOJ4559】[JLoi2016]成绩比较 动态规划+容斥+组合数学
[BZOJ4559][JLoi2016]成绩比较 Description G系共有n位同学,M门必修课.这N位同学的编号为0到N-1的整数,其中B神的编号为0号.这M门必修课编号为0到M-1的整数.一 ...
- [ZJOI2016]小星星(容斥+dp)
洛谷链接:https://www.luogu.org/problemnew/show/P3349 题意相当于给一棵树重新赋予彼此不同的编号,要求树上相邻的两个节点在给定的另外一个无向图中也存在边相连. ...
- [zjoi2016]小星星 (容斥+DP)
我们先用树形DP,求出选取集合S中的点,满足连通性的但是标号可重的方案数,贡献给F(i)(1\(\leq\)i\(\leq\)\(\mid S\mid\)),也就是我们要处理出F(i)代表取至多i个点 ...
- 【BZOJ-4455】小星星 容斥 + 树形DP
4455: [Zjoi2016]小星星 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 204 Solved: 137[Submit][Status] ...
- [BZOJ4455][ZJOI2016]数星星(容斥DP)
4455: [Zjoi2016]小星星 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 707 Solved: 419[Submit][Status] ...
- 【BZOJ5287】[HNOI2018]毒瘤(动态规划,容斥)
[BZOJ5287][HNOI2018]毒瘤(动态规划,容斥) 题面 BZOJ 洛谷 题解 考场上想到的暴力做法是容斥: 因为\(m-n\le 10\),所以最多会多出来\(11\)条非树边. 如果就 ...
- 【LOJ#2542】[PKUWC2018]随机游走(min-max容斥,动态规划)
[LOJ#2542][PKUWC2018]随机游走(min-max容斥,动态规划) 题面 LOJ 题解 很明显,要求的东西可以很容易的进行\(min-max\)容斥,那么转为求集合的\(min\). ...
- [ZJOI2016]小星星&[SHOI2016]黑暗前的幻想乡(容斥)
这两道题思路比较像,所以把他们放到一块. [ZJOI2016]小星星 题目描述 小Y是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有n颗小星星,用m条彩色的细线串了起来,每条细线连着两颗小星星. ...
- 【BZOJ2024】舞会(动态规划,容斥,高精度)
[BZOJ2024]舞会(动态规划,容斥,高精度) 题面 BZOJ 洛谷 题解 这种关系显然要先排序才不会不想影响. 设\(f[i][j]\)表示前\(i\)个女生中,选了\(j\)个女生配对,并且女 ...
随机推荐
- MSP430的CAN通信发送
1. 电路图如下,RE是接收使能,DE是发送使能,看图的话,这个CAN只支持半双工 2. 使用MSP430F149,以下代码只有发送,其实用的是串口 #include <msp430x14x.h ...
- python-前方高能-面向对象-进阶3
面向对象 你写代码的时候 什么时候用面向对象 代码量大,功能多的时候 处理比较复杂的角色之间的关系 qq 好友 陌生人 群 组 复杂的电商程序 公司/学校的人事管理/功能的系统 我的代码的清晰度更高了 ...
- const与readonly常量
const与readonly常量 const与readonly都是用来定义常量,但是它们有什么区别呢? 下面我们来简要的说明一下: const修饰的常量是编译时常量,如:public const St ...
- Java Monitoring&Troubleshooting Tools
JDK Tools and Utilities Monitoring Tools You can use the following tools to monitor JVM performance ...
- JAVA学习笔记--组合与继承
JAVA一个很重要的功能就是代码的可复用性,代码复用可以大大提升编程效率.这里主要介绍两种代码复用方式:组合和继承. 一.组合 组合比较直观,只需在新的类中产生现有类的对象,新的类由现有类的对象组成, ...
- Halcon学习网
重码网是一个在线机器视觉学习网站,推出了Halcon,Visionpro机器视觉学习视频教程,视频内容通俗易懂,没有编程基础的同学,照着视频练习,也同样可以学会. 学机器视觉,拿高薪,成就技术大拿.重 ...
- eBay:美国各州最受欢迎的产品品类
雨果网从美国媒体<商业内幕>8月26日的报道中获悉,电商巨头eBay近日发布了美国各州最受欢迎的产品品类.包括:加州人青睐女性高端配件,而新泽西 州的男人喜欢古龙香水.相比这些华丽配饰而言 ...
- Scrum立会报告+燃尽图 01
此作业要求:[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2190] 一.小组介绍 组长:王一可 组员:范靖旋,王硕,赵佳璐,范洪达,祁 ...
- “Hello World!”团队——Final发布用户使用报告
博客内容: 1.用户体验报告表 2.用户评论截图 3.总结 一.用户体验报告表 用户使用报告 用户类别 用户姓名(化名) 性别 用户职业 使用频次 用户评论 新增用户 小小静 女 中学信息技术老师 8 ...
- 【Alpha】阶段第二次Scrum Meeting
[Alpha]阶段第二次Scrum Meeting 工作情况 团队成员 今日已完成任务 明日待完成任务 刘峻辰 发表评论接口 更新评论接口 赵智源 部署实际项目 编写脚本实现持续集成 肖萌威 编写注册 ...