刷完了去年的省选题,发现自己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. MongoDB学习笔记(三)

    第三章 索引操作及性能测试 索引在大数据下的重要性就不多说了 下面测试中用到了mongodb的一个客户端工具Robomongo,大家可以在网上选择下载.官网下载地址:http://www.robomo ...

  2. sso系统使用

    一:什么是sso(single sign on) ? sso(单点登录系统)简单说就是客户端第一次访问应用1的时候,由于没有登录,会被引导到登录页面进行登录,如果登录校验通过,将返回一个认证信息tic ...

  3. java 中 printf()语句的理解

    对print和println的理解很简单,今天突然接触到printf(),有点懵,整理了下也帮自己理一理 printf是格式化输出的形式 下在举个例子: package other; public c ...

  4. jstack Dump

    jstack Dump 日志文件中的线程状态 dump 文件里,值得关注的线程状态有: 死锁,Deadlock(重点关注)  执行中,Runnable 等待资源,Waiting on conditio ...

  5. iOS9自动布局神器StackView

    http://www.jianshu.com/p/767f72b7d754 这篇文章紧跟上边autolayout的一些小技巧,如果你没有看过,不防先看下<你真的会用autolayout吗?> ...

  6. Django signals机制的几个简单问题

    1.Django signals机制不是异步执行,是同步执行,所以需要异步执行的耗时任务不能用这个. 2.异步耗时任务不用这个,那些用signals?主要是解耦那些多次重复场合被调用的函数.直接用事件 ...

  7. spring cloud 入门系列五:使用Feign 实现声明式服务调用

    一.Spring Cloud Feign概念引入通过前面的随笔,我们了解如何通过Spring Cloud ribbon进行负责均衡,如何通过Spring Cloud Hystrix进行服务断路保护,两 ...

  8. C# 数据库链接字符串加密工具

    有些项目尤其是WinForm或者是WPF项目,针对一些工具形式的小项目,不想软件流出去之后,懂程序的的拿到手之后一看配置文件就知道了我们数据库的用户名和密码,如果外网能访问的话,那就麻烦大了.所以这里 ...

  9. php中获取用户登陆的IP地址以及常规处理

    本文为原创,转载请注明!  在我们开发多站点业务网站中,经常需要获取客户端的ip地址来给用户推荐其所在地址的信息的业务,用php获取客户端的ip地址,我们一般用到的PHP内置方法是$_SERVER[' ...

  10. Oracle解锁表笔记

    1.查询被锁的对象: select object_name,machine,s.sid,s.serial# from v$locked_object l,dba_objects o ,v$sessio ...