差不多是个模板题
给一张仙人掌图求直径
要注意环上的点到最高点的距离要去两侧min值

于是和基环树一样
环上单独求,顺便更新ans和最高点max值
可以用dp+单调队列优化复杂度
高端操作get

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define maxn 50005
using namespace std;
int n,m,cnt=1,head[maxn],dfn[maxn],low[maxn],q[maxn];
int fa[maxn],dis[maxn],num,a[maxn],b[maxn],f[maxn],ans;inline int rd(){int x=0,f=1; char c=' ';while(c<'0' || c>'9') {if(c=='-') f=-1;c=getchar();}while(c<='9' && c>='0') x=x*10+c-'0',c=getchar();return x*f;
}struct EDGE{int to,nxt;
}edge[maxn*10];void add(int x,int y){edge[++cnt].to=y;edge[cnt].nxt=head[x];head[x]=cnt;
}void dp(int x,int y){for(m=0;x!=y;y=fa[y]) a[++m]=dis[y];a[++m]=dis[x];for(int i=1;i<m;i++) a[i+m]=a[i];//可以把环拆成链int p=m/2;int l=1,r=1; q[1]=1;//这个是dp+单调队列优化 不过听说暴力能过?for(int i=2;i<=m+p;i++){while(l<=r && i-q[l]>p) l++;//找到小于半环的两个点ans=max(ans,a[q[l]]+a[i]+i-q[l]);while(l<=r && a[q[r]]+i-q[r]<=a[i]) r--;//单调队列优化关键所在q[++r]=i;}for(int i=1;i<m;i++) dis[x]=max(dis[x],a[i]+min(i,m-i));//把最高点的dis值也更新了
}void tarjan(int u){dfn[u]=low[u]=++num;for(int i=head[u];i;i=edge[i].nxt){int v=edge[i].to;if(fa[u]==v) continue;if(!dfn[v]){fa[v]=u;tarjan(v);low[u]=min(low[u],low[v]);if(dfn[u]<low[v]){//这个地方是判环的常规操作,u,v不在一个环上ans=max(ans,dis[u]+dis[v]+1);dis[u]=max(dis[u],dis[v]+1);}}else low[u]=min(dfn[v],low[u]);//之前这个else不小心放到了if里面调了好久···}int v;for(int i=head[u];i;i=edge[i].nxt)if(fa[v=edge[i].to]!=u && dfn[u]<dfn[v]) dp(u,v);//u,v在一个环上,常规操作
}int main(){n=rd(); m=rd();for(int i=1;i<=m;i++){int k=rd(),x=rd();for(int j=2;j<=k;j++){int y=rd();add(x,y); add(y,x);x=y;}}tarjan(1);printf("%d\n",ans);return 0;
}

仙人掌直径--poj3567/bzoj1023相关推荐

  1. 【仙人掌直径】P4244 [SHOI2008]仙人掌图 II

    题目链接https://www.luogu.org/problem/P4244 题意 仙人掌:无向图,任何一条边至多在一个环内. 直径:任意两点最短路(边权为111)的最大值. 题解 普通树上求直径可 ...

  2. 业界毒瘤仙人掌一条龙服务

    本slide是为了NJU集训队准备....未完待续... 正经定义 : 无向图中的每条边至多位于一个简单环上,且任意两点可达. 由此可知仙人掌的构造方式很"优美",即生成一棵树,把 ...

  3. 仙人掌问题(圆方树)

    [算法简介] 仙人掌就是把树上多连了一些返祖边,构成了一些环 根据仙人掌这个名字我们也可以较为形象的感受到图的形态 具体的,仙人掌分为点仙人掌和边仙人掌,定义分别为点/边最多属于一个环 之所以把这样的 ...

  4. 洛谷 :P5236 【模板】静态仙人掌(圆方树模板 + 仙人掌最短路)

    题意很简单,在仙人掌图上求两点的最短路. 做法:需要用到圆方树 先来看看什么是圆方树:圆方树,就是由仙人掌图转化而来,树上分两种点:圆点和方点,圆点是仙人掌图上的点,方点是由仙人掌的环转化而来. 由于 ...

  5. 基础省选+NOI 第9部分 网络流

    1.二分图匹配 算法竞赛入门经典训练指南+陈锋+ch5.5_二分图的匹配 算法竞赛入门经典训练指南+陈锋+ch5.5_二分图的匹配_哔哩哔哩_bilibili SWPU-ACM每周算法讲堂-匈牙利算法 ...

  6. 省选+NOI 第四部分 图论

    二分图匹配 算法竞赛入门经典训练指南+陈锋+ch5.5_二分图的匹配 算法竞赛入门经典训练指南+陈锋+ch5.5_二分图的匹配_哔哩哔哩_bilibili SWPU-ACM每周算法讲堂-匈牙利算法 S ...

  7. 图论5:Tarjan!塔尖!

    文章目录 小模板 强联通分量 割点 桥 边双连通分量 点双连通分量 支配树 CodeChef - GRAPHCNT 3281: 小P的烦恼 test2018.3.3:problem C 仙人掌和圆方树 ...

  8. [bzoj1023][SHOI2008]cactus仙人掌图【仙人掌】

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1023 [题解] 仙人掌入门题,拿圆方树练练手. 圆方树就是把一个环建一个新方点,然后向 ...

  9. bzoj 1023: [SHOI2008]cactus仙人掌图(仙人掌求直径)

    1023: [SHOI2008]cactus仙人掌图 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 3668  Solved: 1535 [Submi ...

最新文章

  1. 飞桨博士会第三期来啦!中国深度学习技术俱乐部诚邀您加入
  2. CVPR 2019分享会论坛实录丨2019最值得期待的计算机视觉问题有哪些?(附PPT)
  3. python实现数据库连接池_Python实现Mysql数据库连接池
  4. 如何确认11.2 RAC Grid Infrastructure的时区
  5. 什么是Scanner?next()和hasNext() ? nextLine()和hasNextLine()?
  6. HR只在这些时间里看你的简历!
  7. Flex Basis与Width的区别
  8. 显示请求_学习记录:HTTP的响应与请求amp;Curl
  9. C语言经典算法100例-031-判断星期几
  10. java web典型模块大全_python+selenium基于po模式的web自动化测试框架
  11. Microsoft.AspNetCore.Server.Kestrel.Core.BadHttpRequestException: Request body too large
  12. 海康威视_摄像头搜索工具
  13. python中pdfplumber解析pdf_Python教程:pdfplumber提取pdf中的表格数据
  14. c#获取文件的MD5值
  15. php7hugepage,HugePage简介和KVM中使用HugePage
  16. 协同软件市场一盘散沙 春种能否秋收心中没底
  17. Docker 相关配置文件路径
  18. idea2021运行内存扩大
  19. TCP三次握手的相关问题及解答
  20. OverTheWire的bandit游戏1

热门文章

  1. hkust ucl 电子工程比较_香港科技大学(HKUST) 的MSC电子工程(EE)怎么样?
  2. Basler相机硬触发的接线方法
  3. 新手如何入门短视频-今抖云创
  4. 海康威视摄像机OSD设置、字符叠加(时间,通道名称)
  5. miniblink API文档
  6. ECG全方位健康监测,这款智能手环如此雕堡?开箱见证真假
  7. 解决SourceInsight的半个汉字的问题
  8. 2023苹果CMS v10魔加主题1.1.6破解版 支持苹果CMS全部版本
  9. JavaScript 递归之深度优先和广度优先
  10. docker 覆盖 entrypoint_Docker容器技术之Docker file