设f[x]为x子树里能选的最多的路径数,h[x]为x子树里往上走的点的集合,且不与x子树内的最优解冲突

首先f[x]=sum(f[son])

若h[son]与x可以直接匹配,则匹配上,f[x]++

然后把剩下的未配对的son之间进行匹配,f[x]+=最大匹配数

因为度数不超过10,所以设dp[S]表示二进制表示为S的集合里的最大匹配,x=lowbit(S),则

dp[S]=max(dp[S^(1<<x)],dp[S^(1<<x)^(1<<y)]+1),其中y属于S,y>x,且x与y可以匹配

若dp[(1<<t)-1]==dp[((1<<t)-1)^(1<<i)],则表明i不在最优解中,需要将其加入h[x]中

时间复杂度$O(n2^{10})$。

#include<cstdio>
const int N=1010,K=10;
int T,n,m,i,x,y,f[N],q[K],t,a[K][K],dp[1<<K];bool e[N][N];
struct E{int v;E*nxt;}*g[N],*h[N],pool[1010000],*cur=pool;
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline void addg(int x,int y){E*p=cur++;p->v=y;p->nxt=g[x];g[x]=p;}
inline void addh(int x,int y){E*p=cur++;p->v=y;p->nxt=h[x];h[x]=p;}
inline bool match(int x,int y){
for(E*i=h[x];i;i=i->nxt)for(E*j=h[y];j;j=j->nxt)if(e[i->v][j->v])return 1;
return 0;
}
inline void up(int&a,int b){if(a<b)a=b;}
void dfs(int x,int y){
f[x]=0,h[x]=NULL;
for(E*i=g[x];i;i=i->nxt)if(i->v!=y)dfs(i->v,x),f[x]+=f[i->v];
t=0;
for(E*i=g[x];i;i=i->nxt)if(i->v!=y){
bool flag=1;
for(E*j=h[i->v];j;j=j->nxt)if(e[x][j->v]){f[x]++,flag=0;break;}
if(flag)q[t++]=i->v;
}
for(int i=0;i<t;i++)for(int j=i+1;j<t;j++)a[i][j]=match(q[i],q[j]);
int F=(1<<t)-1;
for(int S=1;S<=F;S++){
int i=__builtin_ctz(S&-S);
dp[S]=dp[S^(1<<i)];
for(int U=S-(S&-S);U;U-=U&-U){
int j=__builtin_ctz(U&-U);
if(a[i][j])up(dp[S],dp[S^(1<<i)^(1<<j)]+1);
}
}
f[x]+=dp[F],addh(x,x);
for(int i=0;i<t;i++)if(dp[F]==dp[F^(1<<i)])for(E*j=h[q[i]];j;j=j->nxt)addh(x,j->v);
}
int main(){
for(read(T);T--;printf("%d\n",f[1])){
for(read(n),i=1;i<n;i++)read(x),read(y),addg(x,y),addg(y,x);
for(read(m);m--;e[x][y]=e[y][x]=1)read(x),read(y);
dfs(1,0);
for(cur=pool,i=1;i<=n;i++)for(g[i]=NULL,x=1;x<=n;x++)e[i][x]=0;
}
return 0;
}

  

BZOJ4042 : [Cerc2014] parades的更多相关文章

  1. BZOJ 4042 Luogu P4757 [CERC2014]Parades (树形DP、状压DP)

    题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=4042 (Luogu) https://www.luogu.org/prob ...

  2. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  3. 【BZOJ4042】【CERC2014】parades 状压DP

    题目大意 给你一棵\(n\)个点的树和\(m\)条路径要求你找出最多的路径,使得这些路径不共边.特别的,每个点的度数\(\leq 10\). \(n\leq 1000,m\leq \frac{n(n- ...

  4. luogu_4762: [CERC2014]Virus synthesis

    洛谷_4762:[CERC2014]Virus synthesis 题目描述: 初始有一个空串,利用下面的操作构造给定串\(S\).\(len(S)\leq10^5\) 1: 串开头或末尾加一个字符. ...

  5. [CERC2014]Virus synthesis【回文自动机+DP】

    [CERC2014]Virus synthesis 初始有一个空串,利用下面的操作构造给定串 SS . 1.串开头或末尾加一个字符 2.串开头或末尾加一个该串的逆串 求最小化操作数, \(|S| \l ...

  6. bzoj4044/luoguP4762 [Cerc2014]Virus synthesis(回文自动机+dp)

    bzoj4044/luoguP4762 [Cerc2014]Virus synthesis(回文自动机+dp) bzoj Luogu 你要用ATGC四个字母用两种操作拼出给定的串: 1.将其中一个字符 ...

  7. BZOJ4049 [Cerc2014] Mountainous landscape

    首先对于一个给定的图形,要找到是否存在答案非常简单... 只要维护当然图形的凸包,看一下是否有线段在这条直线上方,直接二分即可,单次询问的时间复杂度$O(logn)$ 现在用线段树维护凸包,即对于一个 ...

  8. BZOJ4046 [Cerc2014] Pork barre

    我们把边按权值从大到小依次加入图中 如果加到边权$V$,则当前的最小生成森林中边权$v\in[V, V']$(其中$V'$是任意值)形成的森林的边权和就是对于询问$[V, V']$的答案 由于点数不多 ...

  9. BZOJ3928 [Cerc2014] Outer space invaders

    第一眼,我勒个去...然后看到n ≤ 300的时候就2333了 首先把时间离散化,则对于一个时间的区间,可以知道中间最大的那个一定要被选出来,然后把区间分成左右两份 于是区间DP就好了,注意用左开右开 ...

随机推荐

  1. Kafka 0.8 如何创建topic

    1. 操作命令 bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 3 --partitions ...

  2. 一些常见修改命令(针对ubuntu 14.04 持续更新中...)

    1.PS1 在哪: echo $PS1    vi /etc/bash.bashrc      /W输出最后一个目录    /w输出完整目录 2.设置静态IP地址:vim /etc/network/i ...

  3. SQL语句(十一)函数查询

    (十一)函数查询 1. 聚合函数 对一组值进行计算,得到一个返回值 SUM(), 求和 AVG(), 求平均 MIN(), 求最小 MAX(), 求最大 COUNT(), 计数,即个数 --例1 求所 ...

  4. MySql数据库表的查询操作

    http://www.cnblogs.com/whgk/p/6149009.html 优化:http://www.ihref.com/read-16422.html MYSQL常用的几种连接查询方法

  5. [转载]Windows 8 VHD 概述与使用

    http://www.cnblogs.com/tonycody/archive/2012/11/30/2796858.html

  6. springMvc + Maven 项目提示 hessian 依赖包 无法下载;

    首先 从 https://github.com/alibaba/dubbo/archive/master.zip 下载最新的 dubbo 源码包到本地某个目录, 解压出来: cmd 进入该目录: 执行 ...

  7. getopts 用法

    getopts是linux系统中的一个内置变量,一般用在循环中.每当执行循环是,getopts都会检查下一个命令选项,如果这些选项出现在option中,则表示是合法选项,否则不是合法选项.并将这些合法 ...

  8. 20155303 实验四 Android程序设计

    20155303 实验四 Android程序设计 目录 第24章:初识Android 任务一: 完成Hello World, 要求修改res目录中的内容,Hello World后要显示自己的学号 学习 ...

  9. RabbitMQ消费端消息的获取方式(.Net Core)

    1[短链接]:BasicGet(String queue, Boolean autoAck) 通过request的方式独自去获取消息,断开式,一次次获取,如果返回null,则说明队列中没有消息. 隐患 ...

  10. 从TFS 删除工作项

    一.进入命令执行窗口的方式 1.若你的TFS服务器上安装了VS开发工作,可以按以下步骤,进入命令行方式,图如下: 2.若你TFS上没有安装VS开发工作,可以从你的开发机器上的VS安装目录下(一般情况下 ...