Luogu 4244 [SHOI2008]仙人掌图

BZOJ 1023

如果我们把所有的环都缩成一个点,那么整张图就变成了一棵树,我们可以直接$dp$算出树的直径。

设$f_x$表示$x$的子树中最长链的长度,那么对于$x$的每一个儿子$y$,先用$f_x + f_y + 1$更新答案,再用$f_y + 1$更新$f_x$。

考虑加入环的情况,保留这个$f_x$的设定。我们可以按照搜索顺序把环上第一个搜到的点看成环的“根”,然后用这个“根”来计算这个环。

假设有环$1, 2, 3, ..., m$,$1$是环的“根”,那么我们可以用$f_i + f_j + min(j - i, m - (j - i))\ (i < j)$来更新答案,然后用$max(f_i + min(i - 1, m - (i - 1)))$来更新$f_1$。

发现这个$min$不怎么好更新,可以断环成链复制一倍,然后用单调队列滑动一个长度为$\left \lfloor \frac{m}{2} \right \rfloor$的区间即可。

在$dfs$的时候保留的$tarjan$时候采用的$dfn$和$low$数组,当$dfn_x < low_y$的时候说明走了一条桥边,按照原来的树形$dp$更新答案。

处理完所有子树之后重新扫一遍儿子,观察是否有$fa_y \neq x$并且$dfn_y > dfn_x$的点,如果有,那么$x$是环的“根”,$y$是环的另一个端点。

时间复杂度应该是$O(n)$吧。

Code:

#include <cstdio>
#include <cstring>
using namespace std;const int N = 5e4 + 5;
const int M = 2e5 + 5;int n, m, tot = 0, head[N], f[N], g[N << 1], q[N << 1];
int ans = 0, dfsc = 0, fa[N], dfn[N], low[N], dep[N];struct Edge {int to, nxt;
} e[M];inline void add(int from, int to) {e[++tot].to = to;e[tot].nxt = head[from];head[from] = tot;
}inline void read(int &X) {X = 0; char ch = 0; int op = 1;for(; ch > '9' || ch < '0'; ch = getchar())if(ch == '-') op = -1;for(; ch >= '0' && ch <= '9'; ch = getchar())X = (X << 3) + (X << 1) + ch - 48;X *= op;
}inline void chkMax(int &x, int y) {if(y > x) x = y;
}inline int min(int x, int y) {return x > y ? y : x;
}inline void swap(int &x, int &y) {int t = x; x = y; y = t;
}inline void solve(int x, int y) {int cnt = 0;for(int tmp = y; tmp != x; tmp = fa[tmp]) g[++cnt] = f[tmp];g[++cnt] = f[x];for(int i = 1; i <= cnt / 2; i++) swap(g[i], g[cnt - i + 1]);   /*    int cnt = dep[y] - dep[x] + 1;for(int tmp = y; tmp != x; tmp = fa[tmp])g[cnt--] = f[tmp];g[cnt] = f[x];cnt = dep[y] - dep[x] + 1;   */for(int i = 1; i < cnt; i++) g[i + cnt] = g[i];int l = 1, r = 0;for(int i = 1; i < 2 * cnt; i++) {for(; l <= r && i - q[l] > (cnt / 2); ++l);if(l <= r) chkMax(ans, g[i] + g[q[l]] + i - q[l]);for(; l <= r && g[q[r]] - q[r] <= g[i] - i; --r);q[++r] = i;}for(int i = 2; i <= cnt; i++)chkMax(f[x], g[i] + min(i - 1, cnt - (i - 1)));
}void dfs(int x, int fat, int depth) {fa[x] = fat, dep[x] = depth;low[x] = dfn[x] = ++dfsc;for(int i = head[x]; i; i = e[i].nxt) {int y = e[i].to;if(y == fat) continue;if(!dfn[y]) {dfs(y, x, depth + 1);low[x] = min(low[x], low[y]);} else low[x] = min(low[x], dfn[y]);if(low[y] > dfn[x]) {chkMax(ans, f[x] + f[y] + 1);chkMax(f[x], f[y] + 1);}}for(int i = head[x]; i; i = e[i].nxt) {int y = e[i].to;
//        if(y == fat) continue;if(fa[y] != x && dfn[y] > dfn[x]) solve(x, y);}
}int main() {read(n), read(m);for(int k, i = 1; i <= m; i++) {read(k);for(int lst, now, j = 1; j <= k; j++) {read(now);if(j != 1) add(now, lst), add(lst, now);lst = now;}}dfs(1, 0, 1);printf("%d\n", ans);return 0;
}
View Code

 

转载于:https://www.cnblogs.com/CzxingcHen/p/9901967.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/464482.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

trim的返回值php,php trim()函数

(1)trim()函数。该函数可以去除字符串开始位置以及结束位置的空格&#xff0c;并返回去掉空格后的字符串。该函数声明如下&#xff1a;string trim ( string str [, string charlist])默认的情况下&#xff0c;该函数去除的字符如下。" " (ASCII 32 码为(0x20))&…

outlook 2007 自动答复邮件

outlook 2007自动答复邮件 步骤 1&#xff1a;创建邮件模板 提示 从 Microsoft Office Online 下载正式&#xff08;英文&#xff09;或者非正式&#xff08;英文&#xff09;外出邮件模板。 在“文件”菜单上&#xff0c;指向“新建”&#xff0c;然后单击“邮件”。在“选项…

我的朋友去国外出差回不来了

年前&#xff0c;我一个朋友因为项目调试需要去国外出差&#xff0c;出国的时候好好的&#xff0c;然后飞到当地没几天疫情突然爆发&#xff0c;国内取消了那个国家的航班&#xff0c;然后就直接滞留在当地回不来了。我朋友从事的是硬件开发&#xff0c;包括器件选型、原理图设…

再谈borland与MS对BUG的不同态度~

在讨论Delphi 6 SP1对BUG的修补问题时(http://www.delphibbs.com/delphibbs/dispq.asp?lid648516)&#xff0c;我提及“强烈建议Borland针对自己的产品出hotfix&#xff0c;而不是让大家非得等到Server Pack”&#xff0c;随后与y9y兄讨论到Borland和MS的不同态度。或者我们可…

JDBCUtils

1 package database;2 3 import java.sql.Connection;4 import java.sql.DriverManager;5 import java.sql.ResultSet;6 import java.sql.SQLException;7 import java.sql.Statement;8 9 /** 10 * <p> 11 * Description:JDBCUtils工具类 12 * </p> 13 * 14 *…

oracle 11g 组合分区,Oracle数据库

数据库分区是每种数据库都需具备的关键功能之一。几乎所有的Oracle数据库都使用分区功能来提高查询的性能&#xff0c;Oracle 11g分区功能可以简化数据库的日常管理维护工作&#xff0c;大大减轻了DBA(数据库设计和管理工程师)的工作负担。分区是探索数据仓库技术选项之一&…

实现购物车的原理

购物车的功能包括以下几项&#xff1a; n 把商品添加到购物车&#xff0c;即订购 n 删除购物车中已定购的商品 n 修改购物车中某一本图书的订购数量 n 清空购物车 n 显示购物车中商品清单及数量、价格 实现购物车的关键在于服务器识别…

C++中virtual关键字的用法

关于virtual关键字的用法总结如下&#xff0c;有错误或者总结不到位的情况请能帮本人指出&#xff0c;非常感谢&#xff01; Virtual是C OO机制中很重要的一个关键字。只要是学过C的人都知道在类Base中加了Virtual关键字的函数就是虚拟函数。 基类的函数调用如果有virtual则…

很不错的Windows 控件 Developer Express Inc.NET

这个是我用 Developer Express Inc.NET 做的小东东&#xff01;很漂亮哦&#xff5e;&#xff01;文件太大了没办法上传&#xff0c;喜欢的可以去 http://www.dnc.com.cn 下载 还有注册机哦&#xff01; 转载于:https://www.cnblogs.com/xnet/archive/2005/12/21/301768.html

人生中的第一个博客

希望通过这几个月的学习&#xff0c;能够把Python掌握&#xff0c;最起码能够找到一份好的工作&#xff0c;通过自己的努力让代码改变世界&#xff01;转载于:https://www.cnblogs.com/nandadao/p/9904378.html

助你成为嵌入式高手的100多个软硬件开源项目

大家好&#xff0c;转发一个朋友总结的资料文章&#xff0c;内容如下大家好&#xff0c;我是老温&#xff0c;今天给大家推荐一个嵌入式开源项目汇总的仓库。学习初期最难找的就是找学习资料了&#xff0c;本贴精心汇总了一些嵌入式相关资源&#xff0c;包括但不限于编程语言、…

oracle联合主键怎么找,Oracle数据库联合主键

1、定义&#xff1a;主键&#xff1a;在Oracle中&#xff0c;主键指能唯一标识一条记录的单个数据表列或联合的数据表列(联合主键|复合主键)。主键用到的数据 表列数据不能包含空值。而且&#xff0c;一张表只能包含一个主键。2、作用&#xff1a;数据表的联…

笔记--相册

function moveleft(id)//图片左移 { var d document.getElementById(piclist); a eval(70); d.scrollLeft a; } function moveright()//图片右移 { var d document.getElementById(piclist); a eval(68); d.scrollLeft - a; } function showBigPic(src)…

工作杂感

其实今天算是平淡无奇的一天但不平淡的只是今天又跟老板谈话了年末嘛&#xff0c;谈话总是正常的自然而然谈到年终奖&#xff0c;加工资&#xff0c;待遇等等事先听到风声&#xff0c;知道涨幅分几等当知道自己的涨幅&#xff0c;已经算是公司数一数二的&#xff0c;已不能去反…

C++/C中mutalbe与volatile的详解

1、 mutalbe的中文意思是“可变的&#xff0c;易变的”&#xff0c;跟constant&#xff08;既C中的const&#xff09;是反义词。在C中&#xff0c;mutable也是为了突破const的限制而设置的。被mutable修饰的变量(mutable只能由于修饰类的非静态数据成员)&#xff0c;将永远处于…

没有mmu可以跑Linux吗?

为什么需要mmu?我们知道应用程序是不能随意访问内存的&#xff0c;如果让应用程序直接访问物理内存&#xff0c;那么计算机是很危险的&#xff0c;计算机内存的所有内容将被完全暴露出来。所以出现了mmu&#xff0c;mmu是内存管理单元&#xff0c;应用程序访问的是虚拟内存&am…

pC机OracLe库磁盘坏如何恢复,电脑硬盘坏了数据能恢复吗(6步教你自己在家轻松恢复数据)...

电脑硬盘毁坏如何恢复数据有过硬盘损坏经历的用户都知道&#xff0c;硬盘损坏其最严重的结果就是导致其中存储的文件难以读取&#xff0c;包括无法复制&#xff0c;无法移动。通常来说&#xff0c;具体的表现形式是复制文件或者传输文件的时候&#xff0c;耗费很长的时间都无法…

又重新让aspspider.net支持中文PDF输出了

经过一番努力&#xff0c;再次看到中文PDF的输出&#xff1b;aspspider.net经过这次更新后&#xff0c;不知道什么原因&#xff0c;使用BaseFont.AddToResourceSearch(MapPath(".\itextsharpasian\") "iTextAsian-1.0.dll");的方法就是不能把iTextAsian-1.…

My new iMac 27

iMac 27 12GB Memory. 用来贴补家用&#xff0c;有需要开发项目的可以与我联系 asp.net、组件开发 ,java,javascript,xml/xslt,objective-c 什么都行. 目前上架产品包括&#xff1a;少儿有声阅读系列《单刀会》《白蛇传》《空城记》&#xff0c;新闻阅读有 “辽宁日报” “辽宁…

url编码函数encodeURI和encodeURIComponent

var url "http://www.wrox.com/illegal value.html#start";encodeURIComponent(url) //"http%3A%2F%2Fwww.wrox.com%2Fillegal%20value.html%23start" encodeURI(url) //"http://www.wrox.com/illegal%20value.html#start" 记住2种特殊字符&…