题目:

求仙人掌直径

http://www.lydsy.com/JudgeOnline/problem.php?id=1023


题解:

首先给出仙人掌的定义:满足所有的边至多在一个环上的无向联通图

我们先考虑一下如何求一棵树的直径

1.维护以每个节点的为根的子树中,以根为一条路径端点的最长路和次长路,

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstring>
  4. #define N 50005
  5. using namespace std;
  6. inline int read()
  7. {
  8. int ret=,neg=;char j=getchar();
  9. for (;j>'' || j<'';j=getchar()) if (j=='-') neg=-;
  10. for (;j>='' && j<='';j=getchar()) ret=ret*+j-'';
  11. return ret*neg;
  12. }
  13. int n,m,ecnt,ind,ans;
  14. int head[N],deep[N],f[N],low[N],dfn[N],fa[N];
  15. int a[*N],q[*N],l,r;
  16. struct adj{int v,nxt;}e[*N];
  17. void add(int u,int v)
  18. {
  19. e[++ecnt].v=v;e[ecnt].nxt=head[u];head[u]=ecnt;
  20. e[++ecnt].v=u;e[ecnt].nxt=head[v];head[v]=ecnt;
  21. }
  22. void dp(int root,int x)
  23. {
  24. int tot=deep[x]-deep[root]+;
  25. for (int i=x;i!=root;i=fa[i])
  26. a[tot--]=f[i];
  27. a[tot]=f[root];
  28. tot=deep[x]-deep[root]+;
  29. for (int i=;i<=tot;i++) a[i+tot]=a[i];
  30. q[]=;l=r=;
  31. for (int i=;i<=*tot;i++)
  32. {
  33. while (l<=r && i-q[l]>tot/) l++;
  34. ans=max(ans,a[i]+i+a[q[l]]-q[l]);
  35. while (l<=r && a[q[r]]-q[r]<=a[i]-i) r--;
  36. q[++r]=i;
  37. }
  38. for (int i=;i<=tot;i++)
  39. f[root]=max(f[root],a[i]+min(i-,tot-i+));
  40. }
  41. void dfs(int x)
  42. {
  43. low[x]=dfn[x]=++ind;
  44. for (int i=head[x],v;i;i=e[i].nxt)
  45. if (e[i].v!=fa[x])
  46. {
  47. if (!dfn[v=e[i].v])
  48. {
  49. fa[v]=x;deep[v]=deep[x]+;
  50. dfs(v);
  51. low[x]=min(low[x],low[v]);
  52. }
  53. else low[x]=min(low[x],dfn[v]);
  54. if (dfn[x]<low[v])
  55. ans=max(ans,f[x]+f[v]+),f[x]=max(f[x],f[v]+);
  56. }
  57. for (int i=head[x],v;i;i=e[i].nxt)
  58. if (fa[v=e[i].v]!=x && dfn[x]<dfn[v])
  59. dp(x,v);
  60. }
  61. int main()
  62. {
  63. n=read();m=read();
  64. for (int i=;i<=m;i++)
  65. {
  66. int k=read(),x=read();
  67. for (int i=;i<=k;i++)
  68. {
  69. int y=read();add(x,y);x=y;
  70. }
  71. }
  72. dfs();
  73. printf("%d\n",ans);
  74. return ;
  75. }

BZOJ 1023: [SHOI2008]cactus仙人掌图 | 在仙人掌上跑DP的更多相关文章

  1. bzoj 1023: [SHOI2008]cactus仙人掌图 tarjan缩环&&环上单调队列

    1023: [SHOI2008]cactus仙人掌图 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1141  Solved: 435[Submit][ ...

  2. 【刷题】BZOJ 1023 [SHOI2008]cactus仙人掌图

    Description 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人掌图(cactus).所谓简单回路就是指在图上不重复经过任何一个顶点的 ...

  3. bzoj 1023: [SHOI2008]cactus仙人掌图 2125: 最短路 4728: 挪威的森林 静态仙人掌上路径长度的维护系列

    %%% http://immortalco.blog.uoj.ac/blog/1955 一个通用的写法是建树,对每个环建一个新点,去掉环上的边,原先环上每个点到新点连边,边权为点到环根的最短/长路长度 ...

  4. bzoj 1023 [SHOI2008]cactus仙人掌图 ( poj 3567 Cactus Reloaded )——仙人掌直径模板

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1023 http://poj.org/problem?id=3567 因为lyd在讲课,所以有 ...

  5. bzoj 1023: [SHOI2008]cactus仙人掌图

    这道题是我做的第一道仙人掌DP,小小纪念一下…… 仙人掌DP就是环上的点环状DP,树上的点树上DP.就是说,做一遍DFS,DFS的过程中处理出环,环上的点先不DP,先把这些换上的点的后继点都处理出来, ...

  6. BZOJ.1023.[SHOI2008]cactus仙人掌图(DP)

    题目链接 类似求树的直径,可以用(类似)树形DP求每个点其子树(在仙人掌上就是诱导子图)最长链.次长链,用每个点子节点不同子树的 max{最长链}+max{次长链} 更新答案.(不需要存次长链,求解过 ...

  7. bzoj 1023: [SHOI2008]cactus仙人掌图【tarjan+dp+单调队列】

    本来想先求出点双再一个一个处理结果写了很长发现太麻烦 设f[u]为u点向下的最长链 就是再tarjan的过程中,先照常处理,用最长儿子链和次长儿子链更新按ans,然后处理以这个点为根的环,也就是这个点 ...

  8. 【BZOJ1023】仙人掌图(仙人掌,动态规划)

    [BZOJ1023]仙人掌图(仙人掌,动态规划) 题面 BZOJ 求仙人掌的直径(两点之间最短路径最大值) 题解 一开始看错题了,以为是求仙人掌中的最长路径... 后来发现看错题了一下就改过来了.. ...

  9. 1023: [SHOI2008]cactus仙人掌图 - BZOJ

    Description如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人图(cactus).所谓简单回路就是指在图上不重复经过任何一个顶点的回路 ...

随机推荐

  1. Vue使用json-server来进行后端数据模拟

    正开发过程中 前后端分离或者不分离 ,接口多半是之后与页面的开发 ,所以建立rest的APL的接口 给前端提供虚拟的数据是非常必要的 所以这里我使用了json-server作为工具,支持CORS和JS ...

  2. CodeTimer 代码性能计数器

    收集整理老赵 的”CodeTimer“. 用于测试代码性能.详见可参考 老赵原文 代码如下: using System; using System.Diagnostics; using System. ...

  3. C#中的线程(二)线程同步基础 (读后感)

    参考文章:https://www.cnblogs.com/dingfangbo/p/5769501.html 一.lock 确保只有一个线程访问某个资源或某段代码.通俗的讲就是多个线程操作相同的锁对象 ...

  4. ThinkPHP框架介绍

    什么是框架 php框架是许多代码的集合,这些代码的程序结构的代码(并不是业务代码)代码中有许多的函数,类,功能类包 不使用框架开发的缺陷 代码编写不规范 牵一发而动全身 不能很好满足客户各方面的需求 ...

  5. Python tips(

    (此文是在实际工程中遇到的一些小问题,给予解决和整理.解决方法大多来自网上零散的文章.有一个系统化的Python问题解决方案,来自<Python 3 学习笔记>雨痕著,其中对Python的 ...

  6. Ubuntu14.04安装opencv2.4.13

    本文参考相关链接:http://blog.csdn.net/honyniu/article/details/46390097   系 统:Ubuntu 14.04 x64 opencv版本:2.4.1 ...

  7. 分支push不上去的问题

    还原一下现场,我在自己的项目里面,从master里面checkout的一个分支,当我在我这个分支里面进行 push代码的操作,我突然发现我的代码不能执行push的操作,如图 这个原因是由于远端的仓库没 ...

  8. javascript数据相关处理,序列化反序列化,数据编码与解码

    对象序列化简而言之,将对象转为字符串.在数据的传输过程中,经常会使用到对象序列化. javascript中常用的对象序列化:JSON.stringify(); javascript中常用的对象反序列化 ...

  9. jsp 中获取自定义变量

    首先确定El表达式的查找范围: 依次从Page.Request.Session.Application 中的 attribute属性中查找. <% String basePath = reque ...

  10. jmeter接口测试--参数化

    接口测试时遇到一些属性不能重复时,可以使用Random 随机函数,除此之外,也可以用用户参数 一..随机参数化 1.在jmeter工具,菜单-选项-函数助手对话框,输入数值,属性,点击生成: 2.在相 ...