Description

如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人图(cactus)。所谓简单回路就是指在图上不重复经过任何一个顶点的回路。 举例来说,上面的第一个例子是一张仙人图,而第二个不是——注意到它有三条简单回路:(4,3,2,1,6,5,4)、(7,8,9,10,2,3,7)以及(4,3,7,8,9,10,2,1,6,5,4),而(2,3)同时出现在前两个的简单回路里。另外,第三张图也不是仙人图,因为它并不是连通图。显然,仙人图上的每条边,或者是这张仙人图的桥(bridge),或者在且仅在一个简单回路里,两者必居其一。定义在图上两点之间的距离为这两点之间最短路径的距离。定义一个图的直径为这张图相距最远的两个点的距离。现在我们假定仙人图的每条边的权值都是1,你的任务是求出给定的仙人图的直径。
Input

输入的第一行包括两个整数n和m(1≤n≤50000以及0≤m≤10000)。其中n代表顶点个数,我们约定图中的顶点将从1到n编号。接下来一共有m行。代表m条路径。每行的开始有一个整数k(2≤k≤1000),代表在这条路径上的顶点个数。接下来是k个1到n之间的整数,分别对应了一个顶点,相邻的顶点表示存在一条连接这两个顶点的边。一条路径上可能通过一个顶点好几次,比如对于第一个样例,第一条路径从3经过8,又从8返回到了3,但是我们保证所有的边都会出现在某条路径上,而且不会重复出现在两条路径上,或者在一条路径上出现两次。
Output

只需输出一个数,这个数表示仙人图的直径长度。
Sample Input
15 3
9 1 2 3 4 5 6 7 8 3
7 2 9 10 11 12 13 10
5 2 14 9 15 10 8
10 1
10 1 2 3 4 5 6 7 8 9 10
Sample Output
9
HINT

对第一个样例的说明:如图,6号点和12号点的最短路径长度为8,所以这张图的直径为8。 【注意】使用Pascal语言的选手请注意:你的程序在处理大数据的时候可能会出现栈溢出。如果需要调整栈空间的大小,可以在程序的开头填加一句:{$M 5000000},其中5000000即指代栈空间的大小,请根据自己的程序选择适当的数值。

做出了这道题,我感觉十分傲(zi)娇(bei),因为我是靠自(ti)己(jie)做出来的

先贴两个大牛的题解

http://z55250825.blog.163.com/blog/static/150230809201412793151890/

http://ydcydcy1.blog.163.com/blog/static/21608904020131493113160/

先考虑没有环的情况,我们可以直接树dp求出最长连

然后有环了,因为是仙人掌图,所以环与环是独立的

先随便dfs出一颗树,然后做树dp

想一想我们一开始是怎么做树dp的,我们用一个f[i]表示从i点往下延伸的距离的最大值,加了环之后,直接做就可能是错的,因为环可能会把距离变小

为了使f[i]仍然有效,我们要对每一个环单独处理

tarjan的时候把环上所有的f[i]求出来(先无视所有环上的边),然后对环进行dp,选两个点用f[i]+f[j]+dis[i,j]更新ans,dis就是环上最短距离

最后用f[i]+dis[i,root]更新f[root],root是这个环最高的点,其他的点不用更新因为已经遍历完了,他们的f就没用了,f[root]的值还要上传所以要更新

环上的dp可以用单调队列维护

就这些了

具体操作可以看一下代码

 {M$ 5000000}
const
maxn=;
var
n,m,num,ans,tot:longint;
f,fa,sum,dfn,low,first:array[..maxn]of longint;
a,q:array[..maxn*]of longint;
next,last:array[..maxn*]of longint; procedure insert(x,y:longint);
begin
inc(tot);
last[tot]:=y;
next[tot]:=first[x];
first[x]:=tot;
end; procedure init;
var
i,j,k,x,y:longint;
begin
read(n,m);
for i:= to m do
begin
read(k);
read(x);
for j:= to k- do
begin
read(y);
insert(x,y);
insert(y,x);
x:=y;
end;
end;
end; function min(x,y:longint):longint;
begin
if x<y then exit(x);
exit(y);
end; function max(x,y:longint):longint;
begin
if x>y then exit(x);
exit(y);
end; procedure dp(root,p:longint);
var
n,front,rear,i:longint;
begin
n:=sum[p]-sum[root]+;
front:=;
rear:=;
i:=p;
while i<>root do
begin
a[n]:=f[i];
dec(n);
i:=fa[i];
end;
a[n]:=f[root];
n:=sum[p]-sum[root]+;
for i:= to n do
a[i+n]:=a[i];
q[front]:=;
for i:= to n+n>> do
begin
while (front<=rear) and (q[front]<i-n>>) do
inc(front);
ans:=max(ans,a[q[front]]+a[i]+i-q[front]);
while (front<=rear) and (a[q[rear]]-q[rear]<=a[i]-i) do
dec(rear);
inc(rear);
q[rear]:=i;
end;
for i:= to n do
f[root]:=max(f[root],a[i]+min(i-,n-i+));
end; procedure tarjan(p:longint);
var
i,q:longint;
begin
inc(num);
dfn[p]:=num;
low[p]:=num;
i:=first[p];
while i<> do
if last[i]<>fa[p] then
begin
q:=last[i];
if dfn[q]= then
begin
fa[q]:=p;
sum[q]:=sum[p]+;
tarjan(q);
end;
low[p]:=min(low[p],low[q]);
if dfn[p]<low[q] then
begin
ans:=max(ans,f[p]+f[q]+);
f[p]:=max(f[p],f[q]+);
end;
i:=next[i];
end
else i:=next[i];
i:=first[p];
while i<> do
begin
if (fa[last[i]]<>p) and (dfn[p]<dfn[last[i]]) then dp(p,last[i]);
i:=next[i];
end;
end; begin
init;
tarjan();
write(ans);
end.

1023: [SHOI2008]cactus仙人掌图 - BZOJ的更多相关文章

  1. bzoj 1023: [SHOI2008]cactus仙人掌图 tarjan缩环&&环上单调队列

    1023: [SHOI2008]cactus仙人掌图 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1141  Solved: 435[Submit][ ...

  2. 【刷题】BZOJ 1023 [SHOI2008]cactus仙人掌图

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

  3. 【BZOJ】1023: [SHOI2008]cactus仙人掌图 静态仙人掌(DFS树)

    [题意]给定仙人掌图(每条边至多在一个简单环上),求直径(最长的点对最短路径).n<=50000,m<=10^7. [算法]DFS树处理仙人掌 [题解]参考:仙人掌相关问题的处理方法(未完 ...

  4. 1023: [SHOI2008]cactus仙人掌图(DP+单调队列优化)

    这道题吗= =首先解决了我多年以来对仙人掌图的疑问,原来这种高大上的东西原来是这个啊= = 然后,看到这种题,首先必须的就是缩点= = 缩点完之后呢,变成在树上找最长路了= =直接树形dp了 那么那些 ...

  5. BZOJ 1023: [SHOI2008]cactus仙人掌图 | 在仙人掌上跑DP

    题目: 求仙人掌直径 http://www.lydsy.com/JudgeOnline/problem.php?id=1023 题解: 首先给出仙人掌的定义:满足所有的边至多在一个环上的无向联通图 我 ...

  6. bzoj 1023: [SHOI2008]cactus仙人掌图 2125: 最短路 4728: 挪威的森林 静态仙人掌上路径长度的维护系列

    %%% http://immortalco.blog.uoj.ac/blog/1955 一个通用的写法是建树,对每个环建一个新点,去掉环上的边,原先环上每个点到新点连边,边权为点到环根的最短/长路长度 ...

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

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

  8. bzoj 1023: [SHOI2008]cactus仙人掌图

    这道题是我做的第一道仙人掌DP,小小纪念一下…… 仙人掌DP就是环上的点环状DP,树上的点树上DP.就是说,做一遍DFS,DFS的过程中处理出环,环上的点先不DP,先把这些换上的点的后继点都处理出来, ...

  9. BZOJ.1023.[SHOI2008]cactus仙人掌图(DP)

    题目链接 类似求树的直径,可以用(类似)树形DP求每个点其子树(在仙人掌上就是诱导子图)最长链.次长链,用每个点子节点不同子树的 max{最长链}+max{次长链} 更新答案.(不需要存次长链,求解过 ...

随机推荐

  1. 省市联动Demo

    <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head><meta ...

  2. 锋利的jQuery第2版学习笔记4、5章

    第4章,jQuery中的事件和动画 注意:使用的jQuery版本为1.7.1 jQuery中的事件 JavaScript中通常使用window.onload方法,jQuery中使用$(document ...

  3. 在虚拟机中安装Linux

    安装CentOS 6.4教程(详细步骤) CentOS是RHEL的克隆版本,功能上是一模一样的,另外重新编译之后还修复了一些后者的bug.主要区别就是CentOS免费,但没有官方的技术支持,而RHEL ...

  4. Linux 命令 - head: 打印文件的开头部分

    命令格式 head [OPTION]... [FILE]... 命令参数 -c, --bytes=[-]K 显示每个文件的前 K 字节内容. -n, --lines=[-]K 显示每个文件的前 K 行 ...

  5. ios中Raw文件系统常用文件夹

    1.[/Applications] 常用软件的安装目录 2.[/Applications/Preferences.app/zh_CN.lproj] 软件Preferences.app的中文汉化文件存放 ...

  6. android结束进程、退出application的方法

    1.finish()方法 finish是Activity的类,仅仅针对Activity,当调用finish()时,只是将活动推向后台,并没有立即释放内存,活动的资源并没有被清理:调用finish()方 ...

  7. linux中FTP自动备份VPS脚本

    服务器多了,网站也越来越多,总觉得不整个备份心里放不下心,并且有好几次rm的操作失误,造成难以挽回的损失.并且大多数的VPS提供商是不提供自动备份功能或者此功能收费价格略高.所以自己还是有必要把这个工 ...

  8. Setup Project 安装项目

    从vs2012起,微软已经不支持setup project了.以此纪念一下setup project.   在新建Setup Project   增加安装内容,通常是直接Oupput一个项目,或者直接 ...

  9. spring quartz 定时任务“Failed to load class "org.slf4j.impl.StaticLoggerBinder”“Checking for available updated version of Quartz”

    Failed to load class "org.slf4j.impl.StaticLoggerBinder 需要slf4j-api.jar.slf4j-log4j12.jar Check ...

  10. 【leetcode】352. Data Stream as Disjoint Intervals

    问题描述: Given a data stream input of non-negative integers a1, a2, ..., an, ..., summarize the numbers ...