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默认采用的是异步加载,但 ...
随机推荐
- R实战 第七篇:绘图文本表
文本表是显示数据的重要图形,一个文本表按照区域划分为:列标题,行标题,数据区,美学特征有:前景样式.背景央视.字体.网格线等. 一,使用ggtexttable绘图文本表 载入ggpubr包,可以使用g ...
- 深入浅出Java concurrent
看 :http://www.blogjava.net/xylz/archive/2010/07/08/325587.html
- JavaScript继承详解
面向对象与基于对象 在传统面向对象的语言中,有两个非常重要的概念 - 类和实例. 类定义了一类事物公共的行为和方法:而实例则是类的一个具体实现. 我们还知道,面向对象编程有三个重要的概念 - 封装.继 ...
- JavaScript脚本放在哪里用户体验好
javascript代码写在<head>里面: 由于这时候网页主体(body)还未加载,所以这里适合放一些不是立即执行的自定义函数,立即执行的语句则很可能会出错(视浏览器而定) javas ...
- access窗口标签居中
Private Sub Form_Resize() On Error Resume Next Me.Width = Me.InsideWidth Me.Section(acDetail).Height ...
- Android开发之adb无法连接
2017/11/14 21:20 Unable to run 'adb': null 21:20 'E:\AndroidSDK\platform-tools\adb.exe start-server' ...
- eBay账号token授权
1.注册开发者账号(https://go.developer.ebay.com/) hufangyong hu6253859. 2.注册沙箱测试账号(http://sandbox.ebay.com ...
- Flask入门之Pycharm写Hello Word
在这里记录整理Flask入门的笔记! 今天讲讲使用Pycharm写一个Hello World 前提是已经安装好Pycharm,安装过程很简单,这里不赘述. 只放两个可以提供注册码的网站: Intell ...
- [ Java面试题 ]基础篇之二
1.String s = new String("xyz");创建了几个StringObject?是否可以继承String类? 两个或一个都有可能,"xyz"对 ...
- NetCore版RPC框架NewLife.ApiServer
微服务和消息队列的基础都是RPC框架,比较有名的有WCF.gRPC.Dubbo等,我们的NewLife.ApiServer建立在网络库NewLife.Net之上,支持.Net Core,追求轻量级和高 ...