研究了一下仙人掌
首先,仙人掌虽然不是树,但却有很强的树的既视感
如果把每个环都看做一个点,那么他就是一棵树
当然这不能直接缩环,因为环和环可以有一个交点
如果是树,求直径都会做,令f[i]表示i到子树的最长距离然后弄一弄
但现在是树套环,怎么弄?
我们先根据dfs时间戳的思想,dfs下去,构成了一棵dfs树
我们的思想是先处理桥(树边),再处理环
这时候f[i]表示i在dfs树上i到子树的最长距离
dfs到i时,我们先用树形dp的思想求出不考虑环的f[i]
然后再把环拉出来一个个考虑,显然环上点j的f[j]除了和环上另一个点组成的路径对ans直接影响外
只会通过对最高点(时间戳最小的点)i的f[i]的影响来影响其他非以i为根的子树上的点
所以我们用环上的点来更新f[i]即可
再考虑环上两点路径对ans直接影响,枚举点j,显然可以得到
显然可以得到ans=max(ans,f[j]+max(f[k]+dis(j,k)));
我们对环上的点按照dfs树上的深度由小到大编号,t是环上点总数
可以得到dis(j,k)=min(k-j,t-k+j-i+1) (k>j)
考虑到环上两点间距离有两种情况,对此我们可以把环复制一遍然后做单调队列即可
最后,显然所有更新都是先更新ans再更新f[i],

 {$m 1000000}
type node=record
po,next:longint;
end; var a,q:array[..] of longint;
fa,low,dfn,f,p,d:array[..] of longint;
e:array[..] of node;
j,s,ans,h,len,i,n,m,x,y:longint; function min(a,b:longint):longint;
begin
if a>b then exit(b) else exit(a);
end; function max(a,b:longint):longint;
begin
if a>b then exit(a) else exit(b);
end; procedure add(x,y:longint);
begin
inc(len);
e[len].po:=y;
e[len].next:=p[x];
p[x]:=len;
end; procedure dp(x,y:longint);
var t,h,r,i,p:longint;
begin
t:=d[y]-d[x]+; //环上点的数目
h:=;
r:=;
p:=y;
for i:=t downto do
begin
a[i]:=f[p];
a[i+t]:=a[i]; //复制一遍,把两点间距离转化为编号差
p:=fa[p];
end;
q[]:=; //维护单调减的双端队列
for i:= to t+t div do
begin
while (h<=r) and (q[h]<i-t div ) do inc(h); //队头的点和当前点的距离已经不是最短距离
ans:=max(ans,a[q[h]]+a[i]+i-q[h]);
while (h<=r) and (a[q[r]]-q[r]<=a[i]-i) do dec(r);
inc(r);
q[r]:=i;
end;
for i:= to t do
f[x]:=max(f[x],a[i]+min(i-,t-i+));
end; procedure tarjan(x:longint);
var i,y:longint;
begin
inc(h);
dfn[x]:=h;
low[x]:=h;
i:=p[x];
while i<> do
begin
y:=e[i].po;
if fa[x]<>y then
begin
if dfn[y]= then
begin
fa[y]:=x;
d[y]:=d[x]+;
tarjan(y);
end;
low[x]:=min(low[x],low[y]);
if dfn[x]<low[y] then //如果与x和x的祖先不构成环
begin
ans:=max(ans,f[x]+f[y]+);
f[x]:=max(f[x],f[y]+);
end;
end;
i:=e[i].next;
end;
i:=p[x];
while i<> do
begin
y:=e[i].po;
if (fa[y]<>x) and (dfn[x]<dfn[y]) then //与x节点成环
dp(x,y);
i:=e[i].next;
end;
end; begin
readln(n,m);
for i:= to m do
begin
read(s);
read(x);
for j:= to s do
begin
read(y);
add(x,y);
add(y,x);
x:=y;
end;
end;
tarjan();
writeln(ans);
end.

bzoj1023的更多相关文章

  1. 【bzoj1023】仙人掌图

    [bzoj1023]仙人掌图 题意 给一棵仙人掌,求直径. \(n\leq 100000\) 分析 分析1:[Tarjan]+[环处理+单调队列优化线性dp]+[树形dp] 分开两种情况处理: ①环: ...

  2. 【BZOJ1023】仙人掌图(仙人掌,动态规划)

    [BZOJ1023]仙人掌图(仙人掌,动态规划) 题面 BZOJ 求仙人掌的直径(两点之间最短路径最大值) 题解 一开始看错题了,以为是求仙人掌中的最长路径... 后来发现看错题了一下就改过来了.. ...

  3. bzoj1023: [SHOI2008]cactus仙人掌图

    学习了一下圆方树. 圆方树是一种可以处理仙人掌的数据结构,具体见这里:http://immortalco.blog.uoj.ac/blog/1955 简单来讲它是这么做的:用tarjan找环,然后对每 ...

  4. bzoj千题计划113:bzoj1023: [SHOI2008]cactus仙人掌图

    http://www.lydsy.com/JudgeOnline/problem.php?id=1023 dp[x] 表示以x为端点的最长链 子节点与x不在同一个环上,那就是两条最长半链长度 子节点与 ...

  5. BZOJ1023 SHOI2008 仙人掌图 仙人掌、单调队列

    传送门 求仙人掌的直径,可以由求树的直径进行拓展,只需要在环上特殊判断. 沿用求树的直径的DP,对于一条不在任何环内的边,直接像树的直径一样转移,然后考虑环的影响. 设环长为\(cir\),在\(df ...

  6. BZOJ1023:[SHOI2008]cactus仙人掌图(圆方树,DP,单调队列)

    Description 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人掌图(cactus). 所谓简单回路就是指在图上不重复经过任何一个顶点 ...

  7. 2018.10.29 bzoj1023: [SHOI2008]cactus仙人掌图(仙人掌+单调队列优化dp)

    传送门 求仙人掌的直径. 感觉不是很难. 分点在环上面和不在环上分类讨论. 不在环上直接树形dpdpdp. 然后如果在环上讨论一波. 首先对环的祖先有贡献的只有环上dfsdfsdfs序最小的点. 对答 ...

  8. bzoj千题计划224:bzoj1023: [SHOI2008]cactus仙人掌图

    又写了一遍,发出来做个记录 #include<cstdio> #include<algorithm> #include<iostream> using namesp ...

  9. [bzoj1023][SHOI2008]cactus 仙人掌图 (动态规划)

    Description 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人图(cactus).所谓简单回路就是指在图上不重复经过任何一个顶点的回 ...

随机推荐

  1. windows 定时任务

    创建定时任务 创建定时任务,时间间隔为1min,开始时间为04:00:00,任务名称为backupSchedule,运行当前目录下的copyData.bat脚本 schtasks /create /s ...

  2. mysql的分区技术(建立分区)

    -- mysql建立表分区,使用range方法建立: create table t_range( id int(11), money int(11) unsigned not null, date d ...

  3. Library cache lock 故障解决一例

    今天收到同事电话,说是数据库中一张名为acct_balance进行操作是奇慢,第一反映是不是扫行计划有问题,结果我错了,现将过程记录下来. 用pl/sql连上数据库情况:1.对acct_balance ...

  4. JS获取日期和时间

    //获取日期和时间 function showDate(){ var myDate = new Date(); myDate.getYear(); //获取当前年份(2位) myDate.getFul ...

  5. Dao模型设计(基于Dao与Hebernate框架)

    以前没有Dao设计模型之前,一般都是这样的流程: ①先设计实体对象 学生对象: package com.itheima.domain; import java.io.Serializable; imp ...

  6. (转)Object-C 中各数据类型转换 NSData转NSString,Byte,UIImage

    ,NSData 与 NSString NSData --> NSString NSString *aString = [[NSString alloc] initWithData:adata e ...

  7. rsync 的使用和参数解释

    备份往往可以为我们提供一种恢复的策略,因此在实际的生产应用中我们需要对系统的各个配置以及数据进行备份.然而普通的备份都是在本地磁盘或者相应的设备上进行,其实这样也存在一种缺陷,就是设备也出现问题怎么办 ...

  8. jquery 中的 this 和 $(this)

    this,表示当前的上下文对象是一个html对象,可以调用html对象所拥有的属性,方法 $(this),代表的上下文对象是一个jquery的上下文对象,可以调用jquery的方法和属性值. 亦即: ...

  9. html5/css3响应式布局介绍及设计流程

    html5/css3响应式布局介绍 html5/css3响应式布局介绍及设计流程,利用css3的media query媒体查询功能.移动终端一般都是对css3支持比较好的高级浏览器不需要考虑响应式布局 ...

  10. sudo: unable to resolve host XXX 解决方法

    执行sudo命令时候,总是提示sudo: unable to resolve host xxx 解决方法: 法1. 在/etc/hosts/添加hosts映射, 如127.0.0.1 xxx 法2. ...