bzoj 4871: [Shoi2017]摧毁“树状图” [树形DP]
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类似
当时我就卡在了如何更新答案的地方:
- 两条路径不相交,\(d[i]+d[i \oplus 1]\),或者一个点的两个子树任选+1
- 两条路径交于一点,从这一点走出三条或四条
\(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;
}
bzoj 4871: [Shoi2017]摧毁“树状图” [树形DP]的更多相关文章
- 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> ...
- BZOJ4871 Shoi2017摧毁“树状图”(树形dp)
设f[i][0/1/2/3/4/5]表示i子树中选一条链不包含根/i子树中选一条链包含根但不能继续向上延伸/i子树中选一条链可以继续向上延伸/选两条链不包含根/选两条链包含根但不能继续向上延伸/选两条 ...
- bzoj4871 [Heoi2017]摧毁“树状图”
刷完了去年的省选题,发现自己dp已经凉凉了. 虽然暴力可以拿到80分的好成绩,但是正解的dp状态和转移还是没能想到,是时候补一波dp了 这道题我们肯定是要树形dp,存的肯定就是子树某种状态的最多的联通 ...
- P3748 [六省联考2017]摧毁“树状图”
传送门 显然是可以树形 $dp$ 的 对每个节点维护以下 $5$ 个东西 $1.$ 从当前节点出发往下的链的最大贡献 $2.$ 节点子树内不经过本身的路径最大贡献 $3.$ 节点子树内经过本身的路径的 ...
- Android一个炫酷的树状图组织架构图开源控件实现过程
Android一个炫酷的树状图组织架构图开源控件 文章目录 [1 简介] [2 效果展示] [3 使用步骤] [4 实现基本布局流程] [5 实现自由放缩及拖动] [6 实现添加删除及节点动画] [7 ...
- SqlServer-无限递归树状图结构设计和查询
在现实生活中,公司的部门设计会涉及到很多子部门,然后子部门下面又存在子部门,形成类似判断的树状结构,比如说评论楼中楼的评论树状图,职位管理的树状图结构等等,实现类似的树状图数据结构是在开发中经常出现的 ...
- Android开源图表之树状图和饼状图的官方示例的整理
最近由于工作需要,所以就在github上搜了下关于chart的三方框架 官方地址https://github.com/PhilJay/MPAndroidChart 由于工作需要我这里整理了一份Ecli ...
- D3树状图给指定特性的边特别显示颜色
D3作为前端图形显示的利器,功能之强,对底层技术细节要求相对比较多. 有一点,就是要理解其基本的数据和节点的匹配规则架构,即enter,update和exit原理,我前面的D3基础篇中有介绍过,不明白 ...
随机推荐
- return机制
C/C++中,函数内部的一切变量(函数内部局部变量,形参 )都是在其被调用时才被分配内存单元.子函数运行结束时,所有局部变量的内存单元会被系统释放.形参和函数内部的局部变量的生命期和作用域都是在函数内 ...
- 【转自知乎】:localhost、127.0.0.1 和 本机IP 三者的区别?
作者:知乎用户链接:https://www.zhihu.com/question/23940717/answer/26230963来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...
- ASP.NET CORE MVC 2.0 项目中引用第三方DLL报错的解决办法 - InvalidOperationException: Cannot find compilation library location for package
目前在学习ASP.NET CORE MVC中,今天看到微软在ASP.NET CORE MVC 2.0中又恢复了允许开发人员引用第三方DLL程序集的功能,感到甚是高兴!于是我急忙写了个Demo想试试,我 ...
- Hadoop 发行版本 Hortonworks 安装详解(二) 安装Ambari
一.通过yum安装ambari-server 由于上一步我们搭建了本地源,实际上yum是通过本地源安装的ambari-server,虽然也可以直接通过官方源在线安装,不过体积巨大比较费时. 这里我选择 ...
- 如何制作gif图片
制作Gif图片的方法很多,大多数情况下都会选择利用PS中的ImageReady插件来制作.其实还有其它更好的选择来制作Gift图片,其中一款软件就是利用Flash来实现.下面小编就给大家展示一下如何利 ...
- DEDECMS首页调用图片集里的多张图片
本文给大家分享的是织梦系统中首页调用图片集里的多张图片的方法,有相同需要的小伙伴可以参考下. 先找到include/common.inc.php文件,把下面代码贴进去(我贴的是我网站上的,具体可根据需 ...
- php中使用head进行二进制流输出,让用户下载PDF等附件的方法
http://blog.csdn.net/jallin2001/article/details/6872951 在PHP的手册中,有如下的方法,可以让用户方便的下载pdf或者其他类似的附件形式,不过这 ...
- 查看php的配置文件Php.ini的位置
标签:php服务器 浏览器 配置文件 Linux local 近来,有不博友问php.ini存在哪个目录下?或者修改php.ini以后为何没有生效?基于以上两个问题,我觉得有必要教一下刚接触PHP的博 ...
- Struts2 04--- 值栈 ognl(S标签)
OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整 ...
- 遇到安装app不识别的情况
一般->blokfile->证书设定设置