刷完了去年的省选题,发现自己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]摧毁“树状图”的更多相关文章

  1. BZOJ4871 Shoi2017摧毁“树状图”(树形dp)

    设f[i][0/1/2/3/4/5]表示i子树中选一条链不包含根/i子树中选一条链包含根但不能继续向上延伸/i子树中选一条链可以继续向上延伸/选两条链不包含根/选两条链包含根但不能继续向上延伸/选两条 ...

  2. bzoj 4871: [Shoi2017]摧毁“树状图” [树形DP]

    4871: [Shoi2017]摧毁"树状图" 题意:一颗无向树,选两条边不重复的路径,删去选择的点和路径剩下一些cc,求最多cc数. update 5.1 : 刚刚发现bzoj上 ...

  3. bzoj 4871: [Shoi2017]摧毁“树状图”

    4871: [Shoi2017]摧毁“树状图” Time Limit: 25 Sec  Memory Limit: 512 MBSubmit: 53  Solved: 9[Submit][Status ...

  4. bzoj 4871: [Shoi2017]摧毁“树状图”【树形dp】

    做不来--参考https://www.cnblogs.com/ezyzy/p/6784872.html #include<iostream> #include<cstdio> ...

  5. P3748 [六省联考2017]摧毁“树状图”

    传送门 显然是可以树形 $dp$ 的 对每个节点维护以下 $5$ 个东西 $1.$ 从当前节点出发往下的链的最大贡献 $2.$ 节点子树内不经过本身的路径最大贡献 $3.$ 节点子树内经过本身的路径的 ...

  6. SqlServer-无限递归树状图结构设计和查询

    在现实生活中,公司的部门设计会涉及到很多子部门,然后子部门下面又存在子部门,形成类似判断的树状结构,比如说评论楼中楼的评论树状图,职位管理的树状图结构等等,实现类似的树状图数据结构是在开发中经常出现的 ...

  7. Android开源图表之树状图和饼状图的官方示例的整理

    最近由于工作需要,所以就在github上搜了下关于chart的三方框架 官方地址https://github.com/PhilJay/MPAndroidChart 由于工作需要我这里整理了一份Ecli ...

  8. D3树状图给指定特性的边特别显示颜色

    D3作为前端图形显示的利器,功能之强,对底层技术细节要求相对比较多. 有一点,就是要理解其基本的数据和节点的匹配规则架构,即enter,update和exit原理,我前面的D3基础篇中有介绍过,不明白 ...

  9. D3树状图异步按需加载数据

    D3.js这个绘图工具,功能强大不必多说,完全一个Data Driven Document的绘图工具,用户可以按照自己的数据以及希望实现的图形,随心所欲的绘图. 图形绘制,D3默认采用的是异步加载,但 ...

随机推荐

  1. Jquery Easing函数库

    从jQuery API 文档中可以知道,jQuery自定义动画的函数.animate( properties [, duration] [, easing] [, complete] )有四个参数: ...

  2. java并发包分析之———Deque和LinkedBlockingDeque

    一.双向队列Deque   Queue除了前面介绍的实现外,还有一种双向的Queue实现Deque.这种队列允许在队列头和尾部进行入队出队操作,因此在功能上比Queue显然要更复杂.下图描述的是Deq ...

  3. 阿里REDIS优化

  4. 学习Spring Boot

    Spring boot 是什么 ? 简单说, spring boot 是一个构建项目的工具, 一个脚手架. Spring boot 能干什么? spring boot 做非常少的配置就可以构建生产级别 ...

  5. Django之Apps源码学习

    先了解下官方文档的介绍 Django包含了一个已经安装应用的注册表,这个注册表存储着配置信息以及用来自省,同时也维护着可用模型的列表. 这个注册表就是apps,位于django.apps下,本质上是一 ...

  6. eclipse web开发Server配置

    用 Tomcat 和 Eclipse 开发 Web 应用程序:http://www.ibm.com/developerworks/cn/opensource/os-eclipse-tomcat/ Ec ...

  7. FPGA图像处理之行缓存(linebuffer)的设计一

    FPGA图像处理之行缓存(linebuffer)的设计一 作者:OpenS_Lee 1 背景知识 在FPGA数字图像处理中,行缓存的使用非常频繁,例如我们需要图像矩阵操作的时候就需要进行缓存,例如图像 ...

  8. codeforces——961A Tetris

    本文是博主原创文章,未经允许不得转载. 我在csdn上也同步发布了此文,链接 https://blog.csdn.net/umbrellalalalala/article/details/798915 ...

  9. 瞎捣鼓的code highlight

    int a ; int b; public int  a ;int b   char c; h2 { text-align: left;}.postTitle{ background-color:#F ...

  10. ubuntu16+zabbix3.4+grafana环境搭建记录

    最近研究了zabbix,稍后放上环境搭建教程,建议想学习搭建的同学记得参考zabbix官网