传送门

首先不考虑带环的仙人掌,如果只是一棵普通的树,可以通过dp求每棵子树中的最长链和次长链求树的直径。

那么如果dfs的时候遇到了环,应该用环上的两点挂着的最长链加上两点间的距离来更新树的直径,并用环上一点的最长链加上它到环的根的距离来更新环的根的最长链。

选择环上两点来更新直径,为了考虑到所有选择,将环断开并拷贝一份新的衔接在后面,形成长为二倍的串。用dp[i]+dp[j]+j-i(i、j为在串中位置)更新直径,单调队列维护单调递减的dp[i]-i,并且如果当前点和队头的距离超过半个环就队头出队。

dfs的时候注意只用low[v]>dfn[u]的v来更新直径和u的最长链,判断是否有环的时候也注意让环的根成为环中深度最浅的,即判断dfn[v]>dfn[u],使u成为环的根,v为环的最后一个点。

#include<iostream>
#include<cstdio>
using namespace std;
const int N=;
int n,m,dp[N],ans,dis[N];
int ver[],Next[],head[N],tot,f[N];
void add(int x,int y){
ver[++tot]=y;
Next[tot]=head[x];
head[x]=tot;
}
int tim,dfn[N],low[N],a[*N],pos[*N],q[*N];
void solve(int x,int y){
int cnt=dis[y]-dis[x]+;
for(int i=y;i!=x;i=f[i]){
a[cnt--]=i;
}
a[cnt]=x;
cnt=dis[y]-dis[x]+;
for(int i=;i<=cnt;i++){
a[i+cnt]=a[i];
}
int l=,r=;
pos[]=,q[]=dp[a[]]-;
for(int i=;i<=*cnt;i++){
while(i-pos[l]>cnt/&&l<=r)l++;
ans=max(ans,q[l]+dp[a[i]]+i);
while(l<=r&&q[r]<=dp[a[i]]-i)r--;
q[++r]=dp[a[i]]-i;
pos[r]=i;
}
for(int i=;i<=cnt;i++){
dp[x]=max(dp[x],dp[a[i]]+min(i-,cnt-i+));
}
}
void dfs(int x,int fa){
dfn[x]=low[x]=++tim;
f[x]=fa;
for(int i=head[x];i;i=Next[i]){
int y=ver[i];
if(y==fa)continue;
if(!dfn[y]){
dis[y]=dis[x]+;
dfs(y,x);
low[x]=min(low[x],low[y]);
}
else low[x]=min(low[x],dfn[y]);
if(dfn[x]<low[y]){
ans=max(ans,dp[x]+dp[y]+);
dp[x]=max(dp[x],dp[y]+);
}
}
for(int i=head[x];i;i=Next[i]){
int y=ver[i];
if(y==fa)continue;
if(f[y]!=x&&dfn[y]>dfn[x]){
solve(x,y);
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=,k,lst,x;i<=m;i++){
scanf("%d",&k);
lst=;
while(k--){
scanf("%d",&x);
if(lst){
add(lst,x),add(x,lst);
}
lst=x;
}
}
dis[]=;
dfs(,);
printf("%d",ans);
return ;
}

洛谷P4244 [SHOI2008]仙人掌图 II的更多相关文章

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

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

  2. P4244 [SHOI2008]仙人掌图 II

    传送门 仙人掌直径,以前好像模拟赛的时候做到过一道基环树的直径,打了个很麻烦的然而还错了--今天才发现那就是这个的弱化版啊-- 如果是树的话用普通的dp即可,记\(f[u]\)表示\(u\)往下最长能 ...

  3. [SHOI2008]仙人掌图 II——树形dp与环形处理

    题意: 给定一个仙人掌,边权为1 距离定义为两个点之间的最短路径 直径定义为距离最远的两个点的距离 求仙人掌直径 题解: 类比树形dp求直径. f[i]表示i向下最多多长 处理链的话,直接dp即可. ...

  4. [SHOI2008]仙人掌图

    [SHOI2008]仙人掌图 LG传送门 还不会仙人掌的同学可以看看我对仙人掌知识的一些梳理. 题意就是求仙人掌的直径,直径定义为图中最短路径最长的两点间的最短路径长度. 按照套路,先考虑求树的直径我 ...

  5. 洛谷 P2616 [USACO10JAN]购买饲料II Buying Feed, II

    洛谷 P2616 [USACO10JAN]购买饲料II Buying Feed, II https://www.luogu.org/problemnew/show/P2616 题目描述 Farmer ...

  6. 洛谷 P1182 数列分段 Section II

    洛谷 P1182 数列分段 Section II 洛谷传送门 题目描述 对于给定的一个长度为N的正整数数列A-iA−i,现要将其分成M(M≤N)M(M≤N)段,并要求每段连续,且每段和的最大值最小. ...

  7. 洛谷P3412 仓鼠找$Sugar\ II$题解(期望+统计论?)

    洛谷P3412 仓鼠找\(Sugar\ II\)题解(期望+统计论?) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327573 原题链接:洛谷P3412 ...

  8. 洛谷P1288 取数游戏II(博弈)

    洛谷P1288 取数游戏II 先手必胜的条件需要满足如下中至少 \(1\) 条: 从初始位置向左走到第一个 \(0\) 的位置,经过边的数目为偶数(包含 \(0\) 这条边). 从初始位置向右走到第一 ...

  9. Bzoj1018/洛谷P4246 [SHOI2008]堵塞的交通(线段树分治+并查集)

    题面 Bzoj 洛谷 题解 考虑用并查集维护图的连通性,接着用线段树分治对每个修改进行分治. 具体来说,就是用一个时间轴表示图的状态,用线段树维护,对于一条边,我们判断如果他的存在时间正好在这个区间内 ...

随机推荐

  1. openstack实战部署

    简介:Openstack系统是由几个关键服务组成,他们可以单独安装,这些服务根据你的云需求工作在一起,这些服务包括计算服务.认证服务.网络服务.镜像服务.块存储服务.对象存储服务.计量服务.编排服务和 ...

  2. <随便写>random函数

    import random random,randint(1,100)返回随机数 random.choice(list)从一个列表中随机选取一个元素返回 random.shuffle(list)将列表 ...

  3. 谈谈HINT /*+parallel(t,4)*/在SQL调优中的重要作用

    /*+parallel(t,4)*/在大表查询等操作中能够起到良好的效果,基于并行查询要启动并行进程.分配任务与系统资源.合并结果集,这些都是比较消耗资源,但我们为能够减少执行事务的时间使用paral ...

  4. 论文阅读笔记---HetConv

    1 写在前边的话 HetConv性能:当使用HetConv取代标准卷积之后,FLOPs大概是之前的1/8到1/3,更重要的是精度几乎不变!!! 论文地址:https://arxiv.org/abs/1 ...

  5. Codeforces Parking Lot

    http://codeforces.com/problemset/problem/630/I 简单的排列组合,推式子技巧:举一个小样例,看着推,别抽象着推,容易错 #include <iostr ...

  6. HashMap四种遍历方式

    public static void main(String[] args){ Map<String,String> map = new HashMap<String, String ...

  7. 关于N个小球放M个盒子解答

    以下是关于关于N个小球放M个盒子的几种情况的解答,蛮详细的(来自博友的)  求精:关于N个小球放M个盒子解答 - chensmiles的日志 - 网易博客http://chensmiles.blog. ...

  8. DuiLib学习笔记3.颜色探究

    在前面两篇日志已经能使用xml了.今天准备好好的折腾一番,结果在颜色上却掉坑里了. 起初我在ps里取颜色为0104ff 这里01为R,04为G,ff为B 在控件的属性里有这样一个属性bkcolor=& ...

  9. 第九章 Odoo 12开发之外部 API - 集成第三方系统

    Odoo 服务器端带有外部 API,可供网页客户端和其它客户端应用使用.本文中我们将学习如何在我们的客户端程序中使用 Odoo 的外部 API.为避免引入大家所不熟悉的编程语言,此处我们将使用基于 P ...

  10. NSLayoutConstraint 开源框架

    https://github.com/cloudkite/Masonry Masonry is a light-weight layout framework which wraps AutoLayo ...