题意

裸的仙人掌直径。

题解

先考虑基环树的直径:先算出每颗“树”的直径,再在环上跑DP

再考虑仙人掌的直径:把每个基环树缩成一条边,边长为基环树深度。

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int N=;
const int M=;
int cnt,head[N];
int c[N*],dp[N],q[N*],ans;
int dfn[N],low[N],tot,fa[N];
int n,m;
struct edge{
int to,nxt;
}e[M*];
void add(int u,int v){
cnt++;
e[cnt].nxt=head[u];
e[cnt].to=v;
head[u]=cnt;
}
void getdp(int x,int y){
int l,r,i,m,p;
for(m=;y!=x;y=fa[y])c[++m]=dp[y];
for(c[++m]=dp[x],i=;i<m;i++)c[i+m]=c[i];
l=r=q[]=;p=m/;
for(i=;i<=m+p;i++){
while(l<=r&&i-q[l]>p)l++;
ans=max(ans,c[i]+c[q[l]]+i-q[l]);
while(l<=r&&c[i]>=c[q[r]]+i-q[r])r--;
q[++r]=i;
}
for(int i=;i<m;i++)dp[x]=max(dp[x],c[i]+min(i,m-i));
}
void Tarjan(int u){
dfn[u]=low[u]=++tot;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(fa[u]==v)continue;
if(dfn[v]==){
fa[v]=u;
Tarjan(v);
low[u]=min(low[v],low[u]);
if(dfn[u]<low[v]){
ans=max(ans,dp[v]+dp[u]+);
dp[u]=max(dp[u],dp[v]+);
}
}else low[u]=min(low[u],dfn[v]);
}
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(fa[v]!=u&&dfn[u]<dfn[v])getdp(u,v);
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=,a,x;i<=m;i++){
scanf("%d%d",&a,&x);
for(int j=,y;j<a;j++){
scanf("%d",&y);
add(x,y);
add(y,x);
x=y;
}
}
Tarjan();
printf("%d",ans);
return ;
}

POJ 3567 Cactus Reloaded(仙人掌直径)的更多相关文章

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

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

  2. bzoj1023 [SHOI2008]cactus仙人掌图 & poj3567 Cactus Reloaded——求仙人掌直径

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1023    http://poj.org/problem?id=3567 仙人掌!直接模仿 ...

  3. POJ 1985 Cow Marathon && POJ 1849 Two(树的直径)

    树的直径:树上的最长简单路径. 求解的方法是bfs或者dfs.先找任意一点,bfs或者dfs找出离他最远的那个点,那么这个点一定是该树直径的一个端点,记录下该端点,继续bfs或者dfs出来离他最远的一 ...

  4. POJ 3384 Feng Shui 凸包直径 + 半平面交

    G++一直没有过了 换成 C++果断A掉了...It's time to bet RP. 题意:给一个多边形,然后放进去两个圆,让两个圆的覆盖面积尽量最大,输出两个圆心的坐标. 思路:将多边形的边向里 ...

  5. HDU 3594 Cactus (强连通+仙人掌图)

    <题目链接> <转载于 >>> > 题目大意: 给你一个图,让你判断他是不是仙人掌图. 仙人掌图的条件是: 1.是强连通图. 2.每条边在仙人掌图中只属于一个 ...

  6. HDU 3594 Cactus(仙人掌问题)

    http://acm.hdu.edu.cn/showproblem.php?pid=3594 题意: 一个有向图,判断是否强连通和每条边只在一个环中. 思路: 仙人掌问题. 用Tarjan算法判断强连 ...

  7. POJ 1985.Cow Marathon-树的直径-树的直径模板(BFS、DFS(vector存图)、DFS(前向星存图))

    Cow Marathon Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 7536   Accepted: 3559 Case ...

  8. [NEERC2007][SHOI2008]Cactus Reloaded

    题目大意: 给你一个仙人掌,求图中相距最远的点对之间的距离. 思路: Tarjan+DP. 我们先考虑一个树的情况. 设用far[u]表示点u出发到其子树中叶子节点的最大距离,若v为u的子结点,很显然 ...

  9. POJ 1985 求树的直径 两边搜OR DP

    Cow Marathon Description After hearing about the epidemic of obesity in the USA, Farmer John wants h ...

随机推荐

  1. Java8内置的四大核心函数式接口

    package java_8; import org.junit.Test; import java.util.ArrayList; import java.util.Arrays; import j ...

  2. 14.boost最小生成树 kruskal_min_spainning_tree

    #include <iostream> #include <boost/config.hpp> //图(矩阵实现) #include <boost/graph/adjac ...

  3. threejs 入门教程1

    最近在看threejs开发指南,总结一下制作最基础的3d场景的8步: 1. 设置场景大小 2. 创建WebGl渲染器 3. 指定根节点元素 4. 初始化场景 5. 添加相机到场景 6. 创建物体到场景 ...

  4. 爬取xml数据之R

    生物信息很多时候要爬数据.最近也看了一些这些方面的. url<-"要爬取的网址" url.html<-htmlParse(url,encoding="UTF- ...

  5. Servlet学习(八)——Session

    1.Session技术 Session技术是将数据存储在服务器端的技术,会为每个客户端都创建一块内存空间存储客户的数据,但客户端需要每次都携带一个标识ID去服务器中寻找属于自己的内存空间.所以说Ses ...

  6. javascript 精确加减乘除

    最近一个项目中要使用 JS 实现自动计算的功能,本以为只是实现简单的加.减.乘.除就可以了,于是三下五除二做完了. 正当我窃喜的时候,发现问题了... 进行一些浮点数运算时,计算结果都是让我大跌眼镜啊 ...

  7. STM8S103 解决Rom空间不足 & Map文件分析

    STM8S103只有8KRom,很容易造成空间不足.对于空间不足,我们就要从map文件着手分析,究竟哪些函数占了多少空间,map文件分为几部分:Segments(总括了各个段所占的空间), Modul ...

  8. UNIX系统高级编程——第六章-系统数据文件和信息-总结

    口令文件: /* The passwd structure. */ struct passwd { char *pw_name; /* Username. */ char *pw_passwd; /* ...

  9. tar 命令man说明

    TAR(1) User Commands TAR(1) NAME tar - manual page for tar 1.26 SYNOPSIS tar [OPTION...] [FILE]... D ...

  10. nginx upstream

    nginx转发http和tcp http转发 upstream goforit_201 { server 172.168.10.10:201; } server { listen 201; serve ...