[SHOI2006]仙人掌

简要解析

其实很简单

只要普通树形 \(dp\) 就行了

\(f_x\) 表示 \(x\) 能向下延深的最大距离,\(v\) 是 \(x\) 的儿子

当一个点不属于任何环时 \(f_x = \max(f_v + 1)\)

这是更新 \(ans = \max(ans , f_x + f_v + 1)\)

只是带环的话,环要单独算

这是我们的直径可以不经过环顶端的点,直接选环中两个点 \(u,v\)

让 \(ans = \max(ans , f_u + f_v + dist_{u,v})\)

显然不能 \(n^2\) 枚举这两个环中点

因为要符合最短路,所以这两个点距离 \(dist_{u,v} \leq lim\),\(lim\) 为环长的一半

那么我们可以再 \(dp\) 求 \(f_u + f_v + dist_{u,v}\)

给 \(u,v\) 规定方向,从离环顶距离小的往大

于是破环成链再倍长,单调队列维护

\(Code\)

#include<cstdio>
#include<iostream>
using namespace std; const int N = 100005;
int n , m , tot , dfc;
int h[N] , dfn[N] , low[N] , fa[N] , f[N] , a[N] , q[N] , ans; struct edge{
int to , nxt;
}e[N << 1];
void add(int x , int y){e[++tot] = edge{y , h[x]} , h[x] = tot;} void solve(int x , int v)
{
int lim , cnt = 0 , h = 1 , r = 1;
for(register int i = v; i != fa[x]; i = fa[i]) a[++cnt] = f[i];
for(register int i = 1; i <= cnt; i++) a[i + cnt] = a[i];
lim = cnt >> 1 , q[1] = 1;
for(register int i = 2; i <= cnt * 2; i++)
{
while (h < r && i - q[h] > lim) h++;
ans = max(ans , i - q[h] + a[i] + a[q[h]]);
while (r >= h && a[q[r]] - q[r] <= a[i] - i) r--;
q[++r] = i;
}
for(register int i = 1; i <= cnt; i++) f[x] = max(f[x] , a[i] + min(i , cnt - i));
} void tarjan(int x)
{
dfn[x] = low[x] = ++dfc;
int v;
for(register int i = h[x]; i; i = e[i].nxt)
{
v = e[i].to;
if (v == fa[x]) continue;
if (!dfn[v]) fa[v] = x , tarjan(v) , low[x] = min(low[x] , low[v]);
else low[x] = min(low[x] , dfn[v]);
if (low[v] > dfn[x])
{
ans = max(ans , f[x] + f[v] + 1);
f[x] = max(f[x] , f[v] + 1);
}
}
for(register int i = h[x]; i; i = e[i].nxt)
if (fa[v = e[i].to] != x && dfn[v] > dfn[x]) solve(x , v);
} int main()
{
scanf("%d%d" , &n , &m);
int num , x , y;
for(register int i = 1; i <= m; i++)
{
scanf("%d%d" , &num , &x);
for(register int j = 2; j <= num; j++)
scanf("%d" , &y) , add(x , y) , add(y , x) , x = y;
}
tarjan(1);
printf("%d" , ans);
}

[SHOI2006]仙人掌的更多相关文章

  1. luogu P4129 [SHOI2006]仙人掌

    题目描述 仙人掌图(cactus)是一种无向连通图,它的每条边最多只能出现在一个简单回路(simple cycle)里面.从直观上说,可以把仙人掌图理解为允许存在回路的树.但是仙人掌图和树之间有个本质 ...

  2. 2018.10.29 洛谷P4129 [SHOI2006]仙人掌(仙人掌+高精度)

    传送门 显然求出每一个环的大小. Ans=∏i(siz[i]+1)Ans=\prod_i(siz[i]+1)Ans=∏i​(siz[i]+1) 注意用高精度存答案. 代码: #include<b ...

  3. 洛谷 P4244 [SHOI2008]仙人掌图 II 解题报告

    P4244 [SHOI2008]仙人掌图 II 题目背景 题目这个II是和SHOI2006的仙人掌图区分的,bzoj没有. 但是实际上还是和bzoj1023是一个题目的. 题目描述 如果某个无向连通图 ...

  4. bzoj1023: [SHOI2008]cactus仙人掌图

    学习了一下圆方树. 圆方树是一种可以处理仙人掌的数据结构,具体见这里:http://immortalco.blog.uoj.ac/blog/1955 简单来讲它是这么做的:用tarjan找环,然后对每 ...

  5. 【BZOJ 1023】【SHOI 2008】cactus仙人掌图

    良心的题解↓ http://z55250825.blog.163.com/blog/static/150230809201412793151890/ tarjan的时候如果是树边则做树形DP(遇到环就 ...

  6. 【BZOJ-1952】城市规划 [坑题] 仙人掌DP + 最大点权独立集(改)

    1952: [Sdoi2010]城市规划 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 73  Solved: 23[Submit][Status][ ...

  7. 【BZOJ-4316】小C的独立集 仙人掌DP + 最大独立集

    4316: 小C的独立集 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 57  Solved: 41[Submit][Status][Discuss] ...

  8. 仙人掌(cactus)

    仙人掌(cactus) Time Limit:1000ms Memory Limit:64MB 题目描述 LYK 在冲刺清华集训(THUSC) !于是它开始研究仙人掌,它想来和你一起分享它最近研究的 ...

  9. 【bzoj1023】仙人掌图

    [bzoj1023]仙人掌图 题意 给一棵仙人掌,求直径. \(n\leq 100000\) 分析 分析1:[Tarjan]+[环处理+单调队列优化线性dp]+[树形dp] 分开两种情况处理: ①环: ...

  10. hdu3594 强连通(仙人掌图)

    题意:给定一张有向图,问是否是仙人掌图.仙人掌图的定义是,首先,这张图是一个强连通分量,其次所有边在且仅在一个环内. 首先,tarjan可以判强连通分量是否只有一个.然后对于所有边是否仅在一个环内,我 ...

随机推荐

  1. Linux禁止摄像头自动曝光(手动调节曝光)

    前言 很多摄像头具有自动曝光的功能,例如在较暗的调节下,提高曝光率,在较亮的调节下降低曝光.下面简单介绍在linux平台俩种方式来修改自动曝光. 软件调节(图形化界面) 安装qv4l2 sudo ap ...

  2. 记录一次从linux移动一个项目到windows遇到的问题

    前言 这几天在linux平台写了一个垃圾软件,浪费了我10多天的时间,感觉很垃圾,然后我想在windows平台打包这个软件,然后出现了一个项目中有相同文件名的问题,导致一些文件相互覆盖 问题描述 我把 ...

  3. nuxt作为主应用接入qiankun的实践(附代码)

    上半年一直在倒腾qiankun,在使用nuxtjs接入qiankun时遇到了一些坑,记录并分享出来,希望能帮助到大家. 代码地址:nuxtjs-qiankun-demo Nuxtjs接入qiankun ...

  4. editorial 专栏

    社论 22.10.1 solution for pl_er 密码是我的名字的拼音 全小写无空格 社论 22.10.2 solution for Simu. 密码是联考密码 社论 22.10.4 sol ...

  5. mysql-DuplicateUpdate和java的threadpool的"死锁"

    大家千万不要被文章的标题给迷惑了,他两在本篇文章是没有关系的, 今天给大家讲讲最近2个有意思的issue,分享一下我学到的 mysql DuplicateUpdate的用法要注意的点 java的thr ...

  6. Pointers and Constants

    Pointers and Constants char * const q = "abc"; // q is const *q = 'c'; // OK q++; //ERROR ...

  7. 接口Interface的作用不止是解耦

    简言: 好久没写博客了,今天手痒想写一写.废话少说,我们直入主题,相信大家对接口interface,这个单词一定不陌生.但是要说到它的作用,除了解耦之外,还有什么作用呢?可能大多数人都不是很清楚(大牛 ...

  8. 从0到1学Python丨图像平滑方法的两种非线性滤波:中值滤波、双边滤波

    摘要:常用于消除噪声的图像平滑方法包括三种线性滤波(均值滤波.方框滤波.高斯滤波)和两种非线性滤波(中值滤波.双边滤波),本文将详细讲解两种非线性滤波方法. 本文分享自华为云社区<[Python ...

  9. vue3项目,记录我是如何用1h实现产品预估1天工作量的界面需求

    最近在编写前端界面,硬是一人一周时间加班加点写完了一个项目的前端界面(一级菜单有12个页面+一个控制台大屏,二三级界面有N个),之前预估前端界面的编写需要一个月,我是自己把自己卷死了(没有办法,项目经 ...

  10. 一文聊透Apache Hudi的索引设计与应用

    Hudi索引在数据读和写的过程中都有应用.读的过程主要是查询引擎利用MetaDataTable使用索引进行Data Skipping以提高查找速度;写的过程主要应用在upsert写上,即利用索引查找该 ...