差不多是个模板题
给一张仙人掌图求直径
要注意环上的点到最高点的距离要去两侧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. b站看那个的python_用Python获取B站播放历史记录 !男友居然天天背着我看这些!...
  2. 我使用Python和Django在自己的网站上建立了一个会员专区。 这是我学到的东西。
  3. python3基础语法-Python3 - 基础语法
  4. 安卓平分位置layout_weight学习记录
  5. DockingManager的使用入门
  6. jquery load使用方法
  7. 关于equals和hashcode方法
  8. CSS3 -webkit-transform(元素变换)
  9. 大神讲解Java for循环的几种用法
  10. java低延迟_像Java这样的C ++具有低延迟
  11. 使用RequestHandlerRetryAdvice重试Web服务操作
  12. 『Material Design 入门学习笔记』前言
  13. 学习笔记-数据结构与算法之线性表
  14. [整理]解析Json需要设置Mime
  15. 计算机财务管理中表格的应用,excel在财务管理中的应用学习心得
  16. m序列的产生原理及其性质
  17. 微信公众平台开发教程(十) 订阅号与服务号的区别
  18. 爱奇艺影业,你明天还为传统电影业打工吗?
  19. Java连接redis集群报错,connection refused 和Could not get a resource from the pool
  20. SAD算法的OpenCV实现

热门文章

  1. 树莓派 摄像头 python_Python实现树莓派摄像头持续录像并传送到主机
  2. 【网页制作】注册表单页
  3. mysql recovery参数_深入理解MySQL 5.7 GTID系列(七)binlog_gtid_simple_recovery参数的影响总结...
  4. 基于matlab的Qlearning强化学习室内路径规划控制算法仿真
  5. Eclipse中进行web project开发时遇到httperror 500 错误 jsp support not configured 问题的解决方法
  6. AndroidAPP的安全模型
  7. [Expression Blend 4] [SketchFlow系列] Chapter 1 瞭解SketchFlow Map (上)
  8. windows系统本地批量预览svg图标
  9. JS把GB、MB、KB、转换为B
  10. Apriori算法及超市数据集挖掘实战