bzoj1023
研究了一下仙人掌
首先,仙人掌虽然不是树,但却有很强的树的既视感
如果把每个环都看做一个点,那么他就是一棵树
当然这不能直接缩环,因为环和环可以有一个交点
如果是树,求直径都会做,令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的更多相关文章
- 【bzoj1023】仙人掌图
[bzoj1023]仙人掌图 题意 给一棵仙人掌,求直径. \(n\leq 100000\) 分析 分析1:[Tarjan]+[环处理+单调队列优化线性dp]+[树形dp] 分开两种情况处理: ①环: ...
- 【BZOJ1023】仙人掌图(仙人掌,动态规划)
[BZOJ1023]仙人掌图(仙人掌,动态规划) 题面 BZOJ 求仙人掌的直径(两点之间最短路径最大值) 题解 一开始看错题了,以为是求仙人掌中的最长路径... 后来发现看错题了一下就改过来了.. ...
- bzoj1023: [SHOI2008]cactus仙人掌图
学习了一下圆方树. 圆方树是一种可以处理仙人掌的数据结构,具体见这里:http://immortalco.blog.uoj.ac/blog/1955 简单来讲它是这么做的:用tarjan找环,然后对每 ...
- bzoj千题计划113:bzoj1023: [SHOI2008]cactus仙人掌图
http://www.lydsy.com/JudgeOnline/problem.php?id=1023 dp[x] 表示以x为端点的最长链 子节点与x不在同一个环上,那就是两条最长半链长度 子节点与 ...
- BZOJ1023 SHOI2008 仙人掌图 仙人掌、单调队列
传送门 求仙人掌的直径,可以由求树的直径进行拓展,只需要在环上特殊判断. 沿用求树的直径的DP,对于一条不在任何环内的边,直接像树的直径一样转移,然后考虑环的影响. 设环长为\(cir\),在\(df ...
- BZOJ1023:[SHOI2008]cactus仙人掌图(圆方树,DP,单调队列)
Description 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人掌图(cactus). 所谓简单回路就是指在图上不重复经过任何一个顶点 ...
- 2018.10.29 bzoj1023: [SHOI2008]cactus仙人掌图(仙人掌+单调队列优化dp)
传送门 求仙人掌的直径. 感觉不是很难. 分点在环上面和不在环上分类讨论. 不在环上直接树形dpdpdp. 然后如果在环上讨论一波. 首先对环的祖先有贡献的只有环上dfsdfsdfs序最小的点. 对答 ...
- bzoj千题计划224:bzoj1023: [SHOI2008]cactus仙人掌图
又写了一遍,发出来做个记录 #include<cstdio> #include<algorithm> #include<iostream> using namesp ...
- [bzoj1023][SHOI2008]cactus 仙人掌图 (动态规划)
Description 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人图(cactus).所谓简单回路就是指在图上不重复经过任何一个顶点的回 ...
随机推荐
- dbms_job涉及到的知识点
用于安排和管理作业队列,通过使用作业,可以使ORACLE数据库定期执行特定的任务. 一.dbms_job涉及到的知识点1.创建job:variable jobno number;dbms_job.su ...
- OC - 11.使用Quartz2D剪裁图片并保存
实现效果 操作步骤 绘制一个矩形框,弹出一个alertView,提示是否保存图片 点击"是",将图片保存到相册 在相册中查看保存的图片 效果图 实现思路 在控制器的view上添加一 ...
- 关于AVAudioPlayer
IOS中有三种播放音频的方式:AVAudioPlayer.音频服务.音频队列. 此文主要讲AVAudioPlayer,其他两个请见相关文章. AVAudioPlayer在AVFoundation框架下 ...
- java时间格式大全
java.util.*;import java.text.*;import java.util.Calendar; public class VeDate { /** * 获取现在时间 * * ...
- C++类继承内存布局(一)
转自:http://blog.csdn.net/jiangyi711/article/details/4890889# 一 类布局 不同的继承方式将导致不同的内存布局 1)C结构 C++基于C,所以C ...
- 状态模式(State Pattern)
状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类. 这个模式将状态封装成为独立的类,并将动作委托到代表当前对象的对象,这样行为就与拥有状态类解耦了. 从客户的角度来看,对象的 ...
- ubuntn svn 安装 配置
参考文章 http://zhan.renren.com/itbegin?gid=3602888498033631485&checked=true 上面的文章说得很详细 sudo apt-ge ...
- Java并发编程二三事
Java并发编程二三事 转自我的Github 近日重新翻了一下<Java Concurrency in Practice>故以此文记之. 我觉得Java的并发可以从下面三个点去理解: * ...
- SQL Join(连接查询)
1.连接查询分为: inner join(自然连接,自连接) Left join(左连接)/Left outer join(左外连接):效果一样 Right join(右连接)/Right outer ...
- IE11的CSS兼容性问题
最近测试给了我一大堆BUG,一瞅发现全是IE11的.吐槽一下这个浏览器真的比较特立独行.很多默认的样式跟别的浏览器不同,而且最明显的一点应该是padding左右内边距往往比别的浏览器大了一倍.但是当需 ...