仙人掌直径--poj3567/bzoj1023
差不多是个模板题
给一张仙人掌图求直径
要注意环上的点到最高点的距离要去两侧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相关推荐
- 【仙人掌直径】P4244 [SHOI2008]仙人掌图 II
题目链接https://www.luogu.org/problem/P4244 题意 仙人掌:无向图,任何一条边至多在一个环内. 直径:任意两点最短路(边权为111)的最大值. 题解 普通树上求直径可 ...
- 业界毒瘤仙人掌一条龙服务
本slide是为了NJU集训队准备....未完待续... 正经定义 : 无向图中的每条边至多位于一个简单环上,且任意两点可达. 由此可知仙人掌的构造方式很"优美",即生成一棵树,把 ...
- 仙人掌问题(圆方树)
[算法简介] 仙人掌就是把树上多连了一些返祖边,构成了一些环 根据仙人掌这个名字我们也可以较为形象的感受到图的形态 具体的,仙人掌分为点仙人掌和边仙人掌,定义分别为点/边最多属于一个环 之所以把这样的 ...
- 洛谷 :P5236 【模板】静态仙人掌(圆方树模板 + 仙人掌最短路)
题意很简单,在仙人掌图上求两点的最短路. 做法:需要用到圆方树 先来看看什么是圆方树:圆方树,就是由仙人掌图转化而来,树上分两种点:圆点和方点,圆点是仙人掌图上的点,方点是由仙人掌的环转化而来. 由于 ...
- 基础省选+NOI 第9部分 网络流
1.二分图匹配 算法竞赛入门经典训练指南+陈锋+ch5.5_二分图的匹配 算法竞赛入门经典训练指南+陈锋+ch5.5_二分图的匹配_哔哩哔哩_bilibili SWPU-ACM每周算法讲堂-匈牙利算法 ...
- 省选+NOI 第四部分 图论
二分图匹配 算法竞赛入门经典训练指南+陈锋+ch5.5_二分图的匹配 算法竞赛入门经典训练指南+陈锋+ch5.5_二分图的匹配_哔哩哔哩_bilibili SWPU-ACM每周算法讲堂-匈牙利算法 S ...
- 图论5:Tarjan!塔尖!
文章目录 小模板 强联通分量 割点 桥 边双连通分量 点双连通分量 支配树 CodeChef - GRAPHCNT 3281: 小P的烦恼 test2018.3.3:problem C 仙人掌和圆方树 ...
- [bzoj1023][SHOI2008]cactus仙人掌图【仙人掌】
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1023 [题解] 仙人掌入门题,拿圆方树练练手. 圆方树就是把一个环建一个新方点,然后向 ...
- bzoj 1023: [SHOI2008]cactus仙人掌图(仙人掌求直径)
1023: [SHOI2008]cactus仙人掌图 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 3668 Solved: 1535 [Submi ...
最新文章
- 飞桨博士会第三期来啦!中国深度学习技术俱乐部诚邀您加入
- CVPR 2019分享会论坛实录丨2019最值得期待的计算机视觉问题有哪些?(附PPT)
- python实现数据库连接池_Python实现Mysql数据库连接池
- 如何确认11.2 RAC Grid Infrastructure的时区
- 什么是Scanner?next()和hasNext() ? nextLine()和hasNextLine()?
- HR只在这些时间里看你的简历!
- Flex Basis与Width的区别
- 显示请求_学习记录:HTTP的响应与请求amp;Curl
- C语言经典算法100例-031-判断星期几
- java web典型模块大全_python+selenium基于po模式的web自动化测试框架
- Microsoft.AspNetCore.Server.Kestrel.Core.BadHttpRequestException: Request body too large
- 海康威视_摄像头搜索工具
- python中pdfplumber解析pdf_Python教程:pdfplumber提取pdf中的表格数据
- c#获取文件的MD5值
- php7hugepage,HugePage简介和KVM中使用HugePage
- 协同软件市场一盘散沙 春种能否秋收心中没底
- Docker 相关配置文件路径
- idea2021运行内存扩大
- TCP三次握手的相关问题及解答
- OverTheWire的bandit游戏1
热门文章
- hkust ucl 电子工程比较_香港科技大学(HKUST) 的MSC电子工程(EE)怎么样?
- Basler相机硬触发的接线方法
- 新手如何入门短视频-今抖云创
- 海康威视摄像机OSD设置、字符叠加(时间,通道名称)
- miniblink API文档
- ECG全方位健康监测,这款智能手环如此雕堡?开箱见证真假
- 解决SourceInsight的半个汉字的问题
- 2023苹果CMS v10魔加主题1.1.6破解版 支持苹果CMS全部版本
- JavaScript 递归之深度优先和广度优先
- docker 覆盖 entrypoint_Docker容器技术之Docker file