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

题意:一颗无向树,选两条边不重复的路径,删去选择的点和路径剩下一些cc,求最多cc数。


update 5.1 : 刚刚发现bzoj上这个做法被hack了....以后再想一下别的做法吧

一开始以为这是三合一,写了x=2和x=1. 后来才明白...人家给出的本来就是最优...你自己再求也无所谓

x=0的树形DP没有想出来,感觉很不好处理。

题解是对边进行树形DP

对于有向边\(p:(u,v)\),\(f(p), g(p), d(p)\)分别表示从v出发走一条,在v子树中走一条经过v,v子树 的最大cc数

注意这个cc数不考虑u所在cc

转移和我一开始想的传统树形DP类似

当时我就卡在了如何更新答案的地方:

  1. 两条路径不相交,\(d[i]+d[i \oplus 1]\),或者一个点的两个子树任选+1
  2. 两条路径交于一点,从这一点走出三条或四条

\(d[i]+d[i \oplus 1]\)这一个转移很巧妙!利用了边是有方向的!

然后我WA了半天结果是被n=1 hack了....

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
#define fir first
#define sec second
const int N = 2e5+5;
inline int read() {char c=getchar(); int x=0,f=1;while(c<'0' || c>'9') {if(c=='-')f=-1; c=getchar();}while(c>='0' && c<='9') {x=x*10+c-'0'; c=getchar();}return x*f;
}int n, u, v;
struct edge{int v, ne;} e[N];
int cnt=1, h[N];
inline void ins(int u, int v) {e[++cnt] = (edge){v, h[u]}; h[u] = cnt;e[++cnt] = (edge){u, h[v]}; h[v] = cnt;
}int f[N], g[N], d[N], vis[N], de[N];
struct meow{int a, b, c, d;meow():a(0), b(0), c(0), d(0){}
};
void dp(int p) {if(vis[p]) return; vis[p] = 1;int u = e[p].v, child = 0;meow t;for(int i=h[u];i;i=e[i].ne) if(i != (p^1)) {child++;dp(i);d[p] = max(d[p], d[i]);if(f[i] >= t.a) t.b = t.a, t.a = f[i];else if(f[i] > t.b) t.b = f[i];}f[p] = max(t.a, 1) + child - 1;g[p] = max(t.a, 1) + max(t.b, 1) + child - 2;d[p] = max(d[p], g[p]);
}void solve() {int ans = 0;for(int i=2; i<=cnt; i++) dp(i), dp(i^1), ans = max(ans, d[i] + d[i^1]);for(int u=1; u<=n; u++) {meow t; meow r;for(int i=h[u];i;i=e[i].ne) {if(f[i] >= t.a) t.d = t.c, t.c = t.b, t.b = t.a, t.a = f[i];else {if(f[i] >= t.b) t.d = t.c, t.c = t.b, t.b = f[i];else {if(f[i] >= t.c) t.d = t.c, t.c = f[i];else if(f[i] > t.d) t.d = f[i];}}if(d[i] >= r.a) r.b = r.a, r.a = d[i];else if(d[i] > r.b) r.b = d[i];}ans = max(ans, r.a + r.b + 1);ans = max(ans, t.a + t.b + t.c + de[u] - 3);ans = max(ans, t.a + t.b + t.c + t.d + de[u] - 4);}printf("%d\n", ans);
}int main() {freopen("in", "r", stdin);int T=read(), x=read();while(T--) {n=read(); cnt = 1; for(int i=1; i<=n; i++) h[i] = de[i] = 0;if(x==1) read(), read();if(x==2) read(), read(), read(), read();for(int i=1; i<n; i++) u=read(), v=read(), ins(u, v), de[u]++, de[v]++;for(int i=1; i<=cnt; i++) vis[i] = 0, f[i] = g[i] = d[i] = 0;if(n == 1) {puts("0"); continue;}solve();}return 0;
}

转载于:https://www.cnblogs.com/candy99/p/6775863.html

bzoj 4871: [Shoi2017]摧毁“树状图” [树形DP]相关推荐

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

    4871: [Shoi2017]摧毁"树状图" Time Limit: 25 Sec  Memory Limit: 512 MB Submit: 53  Solved: 9 [Su ...

  2. 【SHOISXOI2017】bzoj4871 摧毁“树状图”

    考虑关于边的树形dp,对于有向边 e:u−>v e:u->v,维护 fe=max{degv−1,fe1+degv−2}(e1:v−>w,w≠u)ge=max{fe,fe1+fe2+d ...

  3. Linux 命令之 tree -- 以树状图列出目录的内容/查看目录内容

    文章目录 一.命令介绍 二.常用选项 三.命令示例 (一)按树形结构显示当前目录下的内容 (二)按树状图显示当前目录下的所有目录名称而非文件 (三)列出指定目录下的第一层级的文件和目录名称 (四)不显 ...

  4. 递归展示树状图/树状表格

    递归展示树状图 一.数据库表设计 二.后端java递归代码 三.前端展示树状表格 四.效果展示 一.数据库表设计 这里我们采用自关联的设计,通过id和pid的对应来确认数据的上下级关系 建表语句,我这 ...

  5. word列表数据计算机,怎么把树状图的数据填成excel表格-谁会计算机啊,怎么把word里的表格数据转换成簇状......

    excel中生成后的数据透视表如何把树形结构每层的空... 打开Word文档窗口,切换到"插入"功能区.在"插图"分组中单击"图表"按钮. ...

  6. Plotly.js使用详细介绍(折线图、饼状图、点图、水平条形图、桑基图、树状图、等值线图)

    目录 0 写在前面 1 HTML代码 2 折线图 2.1 基本折线图 2.2 复杂折线图 2.2.1 轨迹 2.2.2 布局 3 饼状图 3.1 基本饼状图 3.2 饼图子图 3.3 甜甜圈图 4 点 ...

  7. Java树状图展示的实现

    Java树状图展示的实现 在项目中经常会遇到将数据以树状图的形式展现出来,如图: 有时候不仅要构建树结构,还要计算每个节点拥有的成员数量. 由于我们不能确定树的大小和层级就不能用常规的方法进行展示,我 ...

  8. Tree树状图的动态增删查改(上)生成树状图

    一.刚学习项目里就有使用到树状图这个功能,树状图这个功能是要用到插件才能做的,我目前发现有两个插件的样式是比较好看的,一个是Layui里面自带的树组件,不过它的文档写的挺少的,而且看不懂:另一个是jq ...

  9. python生成环形树状图-networkx

    一,项目简介: 利用networkx官方中的CircularTree案例,修改节点的名称,利用唐代诗人姓名与其诗作中的关键字生成的边,形成以诗人关键字为代表的三层环形树状图. 附上原官方的Circul ...

  10. R语言绘制环形树状图

    R语言绘制环形树状图 1.主要用到dendextend和circlize包绘图: library(dendextend) library(circlize)# 距离矩阵 d <- dist(US ...

最新文章

  1. 镇海区工业机器人与自动化设备_镇海区开展首期“工业机器人操作实训班”蓄力智能制造产业发展...
  2. eclipse中开发python
  3. 我看.Net My Services
  4. Java-----instanceof、isInstance、isAssignableFrom
  5. Codeforces Round #535 (Div. 3) [codeforces div3 难度测评]
  6. Python基础教程: with语句详解
  7. db4o, 看上去很美
  8. 计算机考试题操作题答案,全国计算机等级考试模拟题一(带操作题及答案)
  9. IOS精品源码,仿探探UIButton封装iOS提示弹框迅速引导页自定义导航栏
  10. 两个月新手的几点 storyboard 心得
  11. 宅在家里写数据库中MD5加密
  12. Python中zip函数
  13. MFC学习笔记1---准备工作
  14. 【AI视野·今日CV 计算机视觉论文速览 第224期】Tue, 22 Jun 2021
  15. c语言读bmp格式图片的步骤,C语言读取BMP格式的图片
  16. 2018年迎春杯复赛入围名单(四年级)
  17. Java int 最大值溢出
  18. 水溶性花青素连接剂1617497-19-4,diSulfo-Cyanine5 alkyne,二磺酸花青素Cy5炔基
  19. surfaceView全屏和退出全屏
  20. 2022 年牛客多校第四场补题记录

热门文章

  1. 剑指offer二:替换空格
  2. linux系统初始化脚本
  3. 电脑获取手机文件的一种方式(通过手机建立ftp)
  4. PHP大文件分割上传(分片上传)
  5. PHP 中数组获取不到元素
  6. 线性表之顺序存储结构
  7. Java事务之八——分布式事务(Spring+JTA+Atomikos+Hibernate+JMS)
  8. 献给时尚男女的61句最酷口语(转)
  9. XP引导Ubuntu--Ubuntu手记之系统配置
  10. javascript技巧大全