bzoj4871 [Heoi2017]摧毁“树状图”
刷完了去年的省选题,发现自己dp已经凉凉了。
虽然暴力可以拿到80分的好成绩,但是正解的dp状态和转移还是没能想到,是时候补一波dp了
这道题我们肯定是要树形dp,存的肯定就是子树某种状态的最多的联通块数,那么我们发现有这么几个因素会影响转移
1.子树的根是否被删掉
2.是否有一条链可以从子树中伸出去,即根连的链数是不是奇数
3.子树中共出现了几条路径
那么f[i][0/1(n点删不删)][0/1(能否向上扩展)][0/1/2(子树中共有几条路径)]就是我们的数组定义
转移时我是直接让新的子树和已有的子树信息进行合并,也需要额外记录两个信息,即当前共有几棵子树和当前子树中只有1条路径时的删去根结点时的信息。
看起来状态定义十分麻烦,但是实际只有6个状态是有用的,手动转移,理解了就比较简单。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#define N 100500
using namespace std;
int e=,head[N];
struct edge{
int v,next;
}ed[N<<];
inline void add(int u,int v){
ed[e].v=v;
ed[e].next=head[u];
head[u]=e++;
}
int T,opt,n,ans;
int f[N][][][];//f[i][0/1(n点删不删)][0/1(能否向上扩展)][0/1/2(子树中共有几条路径)]
inline void gmax(int &x,int y){x=x>y?x:y;}
inline int Max(int x,int y){return x>y?x:y;}
void dfs(int x,int fa){
int son=,t=;
for(int i=head[x];i;i=ed[i].next){
int v=ed[i].v;
if(v==fa)continue;
dfs(v,x);
int f1,f2,f3,f4,f5,f6;
f1=f[x][][][];
f2=f[x][][][];
f3=f[x][][][]+;
f4=f[x][][][]+;
f5=f[x][][][]+;
f6=f[x][][][]+;
gmax(f1,f[v][][][]);
gmax(f1,f[v][][][]+);
gmax(f1,f[v][][][]+); gmax(f2,f[v][][][]);
gmax(f2,f[v][][][]+);
gmax(f2,f[v][][][]+);
gmax(f2,f[x][][][]+f[v][][][]-);
gmax(f2,f[x][][][]+f[v][][][]);
gmax(f2,f[x][][][]+f[v][][][]); gmax(f3,f[v][][][]+son);
gmax(f4,f[x][][][]+f[v][][][]); gmax(f5,f[v][][][]+son);
gmax(f5,f[x][][][]+f[v][][][]);
gmax(f5,f[x][][][]+f[v][][][]);
gmax(f5,f[x][][][]+f[v][][][]);
gmax(f5,t+f[v][][][]);
gmax(f5,f[x][][][]+f[v][][][]); gmax(f6,f[x][][][]+f[v][][][]);
gmax(f6,f[x][][][]+f[v][][][]);
gmax(f6,f[x][][][]+f[v][][][]);
gmax(f6,f[x][][][]+f[v][][][]); t=Max(t+,son+Max(f[v][][][],Max(f[v][][][],f[v][][][])));
son++; f[x][][][]=f1;
f[x][][][]=f2;
f[x][][][]=f3;
f[x][][][]=f4;
f[x][][][]=f5;
f[x][][][]=f6;
}
gmax(f[x][][][],son);
}
inline void init(){
e=;
for(int i=;i<=n;++i)
memset(f[i],,sizeof f[i]),head[i]=;
}
inline int read(){
int a=;char ch=getchar();
while(ch<''||ch>'')ch=getchar();
while(ch>=''&&ch<='')a=a*+(ch^),ch=getchar();
return a;
}
int main(){
scanf("%d%d",&T,&opt);
while(T--){
n=read();
init();
for(int i=;i<=opt;++i)read(),read();
for(int i=,u,v;i<n;++i){
u=read();v=read();
add(u,v);add(v,u);
}
dfs(,);
ans=Max(f[][][][],Max(f[][][][],f[][][][]));
printf("%d\n",ans);
}
return ;
}
bzoj4871 [Heoi2017]摧毁“树状图”的更多相关文章
- BZOJ4871 Shoi2017摧毁“树状图”(树形dp)
设f[i][0/1/2/3/4/5]表示i子树中选一条链不包含根/i子树中选一条链包含根但不能继续向上延伸/i子树中选一条链可以继续向上延伸/选两条链不包含根/选两条链包含根但不能继续向上延伸/选两条 ...
- bzoj 4871: [Shoi2017]摧毁“树状图” [树形DP]
4871: [Shoi2017]摧毁"树状图" 题意:一颗无向树,选两条边不重复的路径,删去选择的点和路径剩下一些cc,求最多cc数. update 5.1 : 刚刚发现bzoj上 ...
- bzoj 4871: [Shoi2017]摧毁“树状图”
4871: [Shoi2017]摧毁“树状图” Time Limit: 25 Sec Memory Limit: 512 MBSubmit: 53 Solved: 9[Submit][Status ...
- bzoj 4871: [Shoi2017]摧毁“树状图”【树形dp】
做不来--参考https://www.cnblogs.com/ezyzy/p/6784872.html #include<iostream> #include<cstdio> ...
- P3748 [六省联考2017]摧毁“树状图”
传送门 显然是可以树形 $dp$ 的 对每个节点维护以下 $5$ 个东西 $1.$ 从当前节点出发往下的链的最大贡献 $2.$ 节点子树内不经过本身的路径最大贡献 $3.$ 节点子树内经过本身的路径的 ...
- SqlServer-无限递归树状图结构设计和查询
在现实生活中,公司的部门设计会涉及到很多子部门,然后子部门下面又存在子部门,形成类似判断的树状结构,比如说评论楼中楼的评论树状图,职位管理的树状图结构等等,实现类似的树状图数据结构是在开发中经常出现的 ...
- Android开源图表之树状图和饼状图的官方示例的整理
最近由于工作需要,所以就在github上搜了下关于chart的三方框架 官方地址https://github.com/PhilJay/MPAndroidChart 由于工作需要我这里整理了一份Ecli ...
- D3树状图给指定特性的边特别显示颜色
D3作为前端图形显示的利器,功能之强,对底层技术细节要求相对比较多. 有一点,就是要理解其基本的数据和节点的匹配规则架构,即enter,update和exit原理,我前面的D3基础篇中有介绍过,不明白 ...
- D3树状图异步按需加载数据
D3.js这个绘图工具,功能强大不必多说,完全一个Data Driven Document的绘图工具,用户可以按照自己的数据以及希望实现的图形,随心所欲的绘图. 图形绘制,D3默认采用的是异步加载,但 ...
随机推荐
- How--to-deploy-smart-contracts-on
The following smart contract code is only an example and is NOT to be used in Production systems. pr ...
- JS核心笔记
一.说明 JS权威指南文字用红色标出: JS高级程序设计用橙色标出; 自己加上的文字用粉红色标出: 其(一)-(九)为JS权指南,(十)为JS高级程序设计 二.记法结构 2.1字符集 Javascri ...
- J2SE-程序执行与内存图
全局程序运行内存图 基础数据类型:byte,short,int,long(整数) float,double(浮点) -- 数值 char ...
- 排序算法的C语言实现(下 线性时间排序:计数排序与基数排序)
计数排序 计数排序是一种高效的线性排序. 它通过计算一个集合中元素出现的次数来确定集合如何排序.不同于插入排序.快速排序等基于元素比较的排序,计数排序是不需要进行元素比较的,而且它的运行效率要比效率为 ...
- vue-cli目录结构
- codeforces——961C. Chessboard
本文是博主原创文章,未经允许不得转载. 我在csdn也同步发布了此文,链接 https://blog.csdn.net/umbrellalalalala/article/details/7989225 ...
- 大数据与Mapreduce
第十五章 大数据与Maprudece 一.引言 实际生活中的数据量是非常庞大的,采用单机运行的方式可能需要若干天才能出结果,这显然不符合我们的预期,为了尽快的获得结果,我们将采用分布式的方式,将计算分 ...
- birt4.6部署到tomcat及启动服务报错解决方法
一.下载birt-runtime-4.6.0-20160607.zip包 解压后birt-runtime-4.6.0-20160607\WebViewerExample将WebViewerExampl ...
- SpringMVC+GSON 对象序列化--日期格式的处理
Gson异常强大因此使用它代替了Jackson作为SpringMVC消息转换器. 在自己的项目中,发现对象在序列化后,日期格式出现了问题. 先看问题 在员工表中有一列是生日,字段类型为Date,也就是 ...
- Binary Search 的递归与迭代实现及STL中的搜索相关内容
与排序算法不同,搜索算法是比较统一的,常用的搜索除hash外仅有两种,包括不需要排序的线性搜索和需要排序的binary search. 首先介绍一下binary search,其原理很直接,不断地选取 ...