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了....

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6. typedef long long ll;
  7. #define fir first
  8. #define sec second
  9. const int N = 2e5+5;
  10. inline int read() {
  11. char c=getchar(); int x=0,f=1;
  12. while(c<'0' || c>'9') {if(c=='-')f=-1; c=getchar();}
  13. while(c>='0' && c<='9') {x=x*10+c-'0'; c=getchar();}
  14. return x*f;
  15. }
  16. int n, u, v;
  17. struct edge{int v, ne;} e[N];
  18. int cnt=1, h[N];
  19. inline void ins(int u, int v) {
  20. e[++cnt] = (edge){v, h[u]}; h[u] = cnt;
  21. e[++cnt] = (edge){u, h[v]}; h[v] = cnt;
  22. }
  23. int f[N], g[N], d[N], vis[N], de[N];
  24. struct meow{
  25. int a, b, c, d;
  26. meow():a(0), b(0), c(0), d(0){}
  27. };
  28. void dp(int p) {
  29. if(vis[p]) return;
  30. vis[p] = 1;
  31. int u = e[p].v, child = 0;
  32. meow t;
  33. for(int i=h[u];i;i=e[i].ne) if(i != (p^1)) {
  34. child++;
  35. dp(i);
  36. d[p] = max(d[p], d[i]);
  37. if(f[i] >= t.a) t.b = t.a, t.a = f[i];
  38. else if(f[i] > t.b) t.b = f[i];
  39. }
  40. f[p] = max(t.a, 1) + child - 1;
  41. g[p] = max(t.a, 1) + max(t.b, 1) + child - 2;
  42. d[p] = max(d[p], g[p]);
  43. }
  44. void solve() {
  45. int ans = 0;
  46. for(int i=2; i<=cnt; i++) dp(i), dp(i^1), ans = max(ans, d[i] + d[i^1]);
  47. for(int u=1; u<=n; u++) {
  48. meow t; meow r;
  49. for(int i=h[u];i;i=e[i].ne) {
  50. if(f[i] >= t.a) t.d = t.c, t.c = t.b, t.b = t.a, t.a = f[i];
  51. else {
  52. if(f[i] >= t.b) t.d = t.c, t.c = t.b, t.b = f[i];
  53. else {
  54. if(f[i] >= t.c) t.d = t.c, t.c = f[i];
  55. else if(f[i] > t.d) t.d = f[i];
  56. }
  57. }
  58. if(d[i] >= r.a) r.b = r.a, r.a = d[i];
  59. else if(d[i] > r.b) r.b = d[i];
  60. }
  61. ans = max(ans, r.a + r.b + 1);
  62. ans = max(ans, t.a + t.b + t.c + de[u] - 3);
  63. ans = max(ans, t.a + t.b + t.c + t.d + de[u] - 4);
  64. }
  65. printf("%d\n", ans);
  66. }
  67. int main() {
  68. freopen("in", "r", stdin);
  69. int T=read(), x=read();
  70. while(T--) {
  71. n=read();
  72. cnt = 1; for(int i=1; i<=n; i++) h[i] = de[i] = 0;
  73. if(x==1) read(), read();
  74. if(x==2) read(), read(), read(), read();
  75. for(int i=1; i<n; i++) u=read(), v=read(), ins(u, v), de[u]++, de[v]++;
  76. for(int i=1; i<=cnt; i++) vis[i] = 0, f[i] = g[i] = d[i] = 0;
  77. if(n == 1) {puts("0"); continue;}
  78. solve();
  79. }
  80. return 0;
  81. }

bzoj 4871: [Shoi2017]摧毁“树状图” [树形DP]的更多相关文章

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

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

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

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

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

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

  4. bzoj4871 [Heoi2017]摧毁“树状图”

    刷完了去年的省选题,发现自己dp已经凉凉了. 虽然暴力可以拿到80分的好成绩,但是正解的dp状态和转移还是没能想到,是时候补一波dp了 这道题我们肯定是要树形dp,存的肯定就是子树某种状态的最多的联通 ...

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

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

  6. Android一个炫酷的树状图组织架构图开源控件实现过程

    Android一个炫酷的树状图组织架构图开源控件 文章目录 [1 简介] [2 效果展示] [3 使用步骤] [4 实现基本布局流程] [5 实现自由放缩及拖动] [6 实现添加删除及节点动画] [7 ...

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

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

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

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

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

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

随机推荐

  1. HDU1061-Rightmost Digit-规律题,快速幂

    Rightmost Digit Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  2. Kafka监控安装

    p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...

  3. SSM框架原理,作用及使用方法

    ---恢复内容开始--- 尊重原创:http://m.blog.csdn.net/dennis_wu_/article/details/73437097 作用: SSM框架是spring MVC ,s ...

  4. js根据出生年月日换算年龄

    function age_Conversion(date) { debugger var age = ''; var str = date.replace(/年|月/g, "-") ...

  5. python基础2 day3

    一.上节回顾 1,while else2,格式化输出name = input('>>>')s1 = '我叫%s,今年%d岁'%(name,18)dic1name = input('& ...

  6. Sqoop导入导出的几个例子

    Sqoop导入导出的几个例子 http://sqoop.apache.org/docs/1.4.6/SqoopUserGuide.html#_importing_data_into_hive   no ...

  7. Linq学习(主要参考linq之路)----2LINQ方法语法

    方法语法:Fluent Syntax 方法语法是非常灵活和重要的.我们这里讲描述使用连接查询运算符的方式来创建复杂的子查询,方法语法的本质是通过扩展方法和Lambda表达式来创建查询. eg1: st ...

  8. 访问网站出现 Directory Listing Denied This Virtual Directory 

    出现这个提示是指没有在您指定的目录找到默认首页,比如您直接输入域名访问空间, 但是出现以上提示,那么请检查目录下是否有 index.htm,index.html,index.asp,default.a ...

  9. scrapy_全站爬取

    如何查询scrapy有哪些模版? scrapy genspider –list 如何创建crawl模版? scrapy genspider -t crawl 域名 scrapy genspider - ...

  10. List迭代过滤操作注意点

    今天在写一段很简单的代码,本来以为肯定没什么问题,然后直接跑的时候,吆,简单的一个List的操作报错了.仔细一看代码,确实有问题,但是一般真的是如果稍微不小心就会犯下面这种愚蠢的操作. 这里我把代码贴 ...