bzoj 1023: [SHOI2008]cactus仙人掌图

题意:给一颗仙人掌,求它的直径。

有关的定义题目中说的很清楚,就不再重复了。
首先假如给的是一棵树,求树的直径,就比较简单,可以dfs或bfs。
考虑dp的做法。
设集合g表示i到其各个子树的最长链链,即以i为最高点,且除端点外,没有相交的不同最长链。(语文死得早,意会下吧)
于是过i,且完全在其子树中的最长链是g中最大的+次大的。其长度记为F。
直径显然存在唯一最高点,所以ans=Max{F1,F2,F3,……Fn,}
有个不错的求法,f[i]表示i为最高点的最长链,每次更新完儿子y后用f[x]+f[y]+1更新答案,再用f[y]+1更新f[x]。拓扑序dp就行了。
根据仙人掌图的定义:同一条边至多出现在一个环中,可知若将原图缩点后(一个点是一个简单环或几个并在一起),一定是一棵树,因为若还出现环,就不符合定义了。不连通?不存在的事。
我说的一个环的最高点,是离根最近,也就是最先访问的点。他的状态可以表示整个环的状态,因为对于他的祖先来说,只有他是有用的,而他们的儿子,因为按照dfs序,已经访问完了,更没有影响。
要缩点当然要上tarjan了,但有些不同,大概是一边缩一边dp,然后用自己的状态更新父亲状态(一波蒟蒻口胡)
dfn还是表示dfs序,low可以理解为所处的环中最高点的编号,一个点就假装是环吧。
那么对于所有边可以分为两类,桥和环中的边,也就是树边和非树边(纯属蒟蒻瞎定义)
当一个点x并没有处于环中时,直接按上面说的那样dp就可以了,此时dfn[x]=low[x],且对于他所有儿子y都有low[y]大于dfn[x]。
当你发现low[y]<=dfn[x]是,说明x,y一定形成了环,这时就直接跳过不更新答案,访问别的点,f数组暂时不考虑有环的情况,最后找回环的最高点更新。
但问题是怎么找回最高点?
难以描述,直接上代码

if(tr[y].fa!=x&&dfn[x]<dfn[y])

容易得知,整个环一定是按某个顺序访问的
这里写图片描述
那当回到最高点时,再访问最低点(不是直观的低,意思是dfn最大的点)时才会满足这两个条件。
注意,不能写成这样:

if(tr[y].fa!=x&&dfn[x]==low[x])

如果研究过样例,可以发现这种情况
这里写图片描述
这种情况最好一个个环处理,如果传一个这么复杂的环进去,起码我是不知道怎么dp啊。
所以我们得到了最高点的和最低点,整个环由他们的fa指针形成一条链,可以很容易的提取出来,然后就是喜闻乐见的dp了。

for(int i=2;i<=tot;i++)f[root]=max(f[root],map[i]+min(i-1,tot-i+1));

还有一个巨大的问题,就是没有统计经过环的边。如图:
这里写图片描述
这是其实只要在提取出对应点,做一次dp就可以了,或者都不算dp。

for(int i=1;i<=tot;i++)for(int j=i+1;j<=tot;j++)ans=max(ans,map[i]+map[j]+min(j-i,i+tot-j));

正确性显然,只是会T到妈都不认得。
设dis(x,y)表示环上x,y的最短路,易证dis(x,y)<=tot/2。
所以断环为链,复制一份,显然有单调性,直接单调队列就可有O(n)了。
code:

#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<iostream>
using namespace std;
const int inf=(1<<28);
struct node{int y,next;}a[2000005];int last[50010],len=0;
int dfn[50010],low[50010],n,m,f[50010],ans=-inf,id=0;
struct trnode{int dep,fa;
}tr[50010];
inline int read()
{int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
void ins(int x,int y)
{a[++len].y=y;a[len].next=last[x];last[x]=len;
}
int map[100010],q[100010],l,r;
void dp(int root,int x)//最高点和最低点 
{int tot=tr[x].dep-tr[root].dep+1;for(int i=x;i!=root;i=tr[i].fa)map[tot--]=f[i];map[tot]=f[root];tot=tr[x].dep-tr[root].dep+1;for(int i=1;i<=tot;i++) map[i+tot]=map[i];q[1]=1;l=1;r=1;for(int i=2;i<=tot+1;i++)//单调队列 {while(l<=r&&i-q[l]>tot/2) l++;int j=q[l];ans=max(ans,map[i]+map[j]+i-j);while(l<=r&&map[q[r]]-q[r]<=map[i]-i) r--;q[++r]=i;}for(int i=2;i<=tot;i++)//更新最高点 f[root]=max(f[root],map[i]+min(i-1,tot-i+1));
}void dfs(int x,int fa)
{dfn[x]=low[x]=++id;tr[x].fa=fa;tr[x].dep=tr[fa].dep+1;for(int i=last[x];i;i=a[i].next){int y=a[i].y;if(y==fa) continue;if(dfn[y]==-1){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,f[y]+f[x]+1);f[x]=max(f[y]+1,f[x]);}}for(int i=last[x];i;i=a[i].next){int y=a[i].y;if(tr[y].fa!=x&&dfn[x]<dfn[y])//找最高点 dp(x,y);}
}
int main()
{n=read();m=read();memset(last,0,sizeof(last));for(int i=1;i<=m;i++){int k,x;k=read();x=read();for(int j=2;j<=k;j++){int y;y=read();ins(x,y);ins(y,x);x=y;}}memset(f,0,sizeof(f));memset(dfn,-1,sizeof(dfn));tr[0].dep=0;dfs(1,0);printf("%d",ans);
}

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

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

相关文章

仙人掌树

文章目录 普通仙人掌参考文献例题讲解构造圆方树圆方树的性质这道题目的解法代码 广义仙人掌参考文献例题做法代码性质 最后说 普通仙人掌 参考文献 奆佬YYB的博客 Orz&#xff1a;https://www.cnblogs.com/cjyyb/p/9098400.html 例题 题目 讲解 构造圆方树 这道题目其实…

BZOJ1023 [SHOI2008]cactus仙人掌图

标签&#xff1a;图论-仙人掌&#xff0c;DP-杂题 题目 题目传送门 Description 如果某个无向连通图的任意一条边至多只出现在一条简单回路&#xff08;simple cycle&#xff09;里&#xff0c;我们就称这张图为仙人掌图&#xff08;cactus&#xff09;。所谓简单回路就是指…

牛客-紫魔法师(仙人掌染色-判奇环)

题目链接&#xff1a;https://ac.nowcoder.com/acm/contest/7016/F 博客园食用链接&#xff1a;https://www.cnblogs.com/lonely-wind-/p/13530156.html 题目描述 “サーヴァント、キャスター、Medea。”–紫魔法师 给出一棵仙人掌(每条边最多被包含于一个环&#xff0c;无自…

BZOJ4784 [Zjoi2017]仙人掌

标签&#xff1a;树形DP&#xff0c;tarjan&#xff0c;仙人掌 题目 题目传送门 Description 如果一个无自环无重边无向连通图的任意一条边最多属于一个简单环&#xff0c;我们就称之为仙人掌。所谓简单环即不经过重复的结点的环。 现在九条可怜手上有一张无自环无重边的…

如何绘制一组创意的仙人掌图标

创建新的项目文件 启动并在后台运行Illustrator&#xff0c;创建新文档&#xff08;文件>新建或Control-N&#xff09; 画板数量&#xff1a;1 宽度&#xff1a; 800像素 高度&#xff1a; 600像素 单位&#xff1a; 像素 进入“高级”选项卡&#xff1a; 色彩模式&a…

大量短信群发?不妨来看看这几个平台

最近在跟着公司一块做一个新的项目&#xff0c;刚好我做到注册登录的模块&#xff0c;一个需要短信群发的功能&#xff0c;没有过多的精力去写短信验证码模块&#xff0c;便找了几个比较好用的API短信接口平台&#xff1b;在这里给大家列举几个不同的平台&#xff0c;希望能帮到…

短信平台不知道怎么选?来看看这几个平台:

不少程序员在做项目的时候会碰上短信收发验证码的问题&#xff0c;通常来说解决方案有二&#xff0c;要么自己写一个验证码模块儿&#xff0c;要么去找短信平台。但自己写一个验证码模块是出了名的麻烦&#xff0c;而且会耗费掉不少时间&#xff0c;有着时间到不如优化下自己的…

【chatgpt代码系列】雷达转点云算法沟通记录

AI作为一个强大的生产力工具&#xff0c;怎么使用它才能快速结合我们自己的工作呢&#xff1f;下面是我的探索&#xff0c;目前来看&#xff0c;是可以代替百度谷歌等搜索引擎的一部分作用&#xff0c;加入到我的工作流当中。

重磅!openAI开放chatGPT模型APIgpt-3.5-turbo,成本直降90%!

ChatGPT API&#xff0c;千呼万唤终于来了。 chatGPT不仅开放 成本还直降90%&#xff01; 全新API基于“gpt-3.5-turbo”模型&#xff0c;其基础是支持ChatGPT的GPT 3.5模型&#xff0c;取代了此前的“text-davinci-003.”。这款名为“gpt-3.5-turbo”的模型&#xff0c;定价…

模型量化:PTQ + onnx

8 位线性量化的数学表达 将 32 位浮点(实数)模型转换为 8 位整数模型 F 32 S c a l e ∗ ( I i n t 8 − Z ) 量化公式&#xff1a; I i n t 8 F 32 S c a l e Z F_{32} Scale * (I_{int8}-Z)\\ 量化公式&#xff1a; I_{int8} \frac{F_{32}}{Scale} Z F32​Scale∗(Ii…

模型量化

https://zhuanlan.zhihu.com/p/132561405 模型量化是一种将浮点计算转成低比特定点计算的技术&#xff0c;可以有效的降低模型计算强度、参数大小和内存消耗&#xff0c;但往往带来巨大的精度损失。尤其是在极低比特(<4bit)、二值网络(1bit)、甚至将梯度进行量化时&#xf…

量化模型

量化模型&#xff08;Quantized Model&#xff09;是一种模型加速&#xff08;Model Acceleration&#xff09;方法的总称&#xff0c;包括二值化网络&#xff08;Binary Network&#xff09;、三值化网络&#xff08;Ternary Network&#xff09;&#xff0c;深度压缩&#xf…

读取锁信息失败(8):该账户当前被锁定,所以用户 ‘sa‘ 登录失败。

读取锁信息失败(8)&#xff1a;该账户当前被锁定&#xff0c;所以用户 sa 登录失败。系统管理员无法将该账户解锁。 State:37000,Native:18486,Origin:[Microsoft][ODBC SQL Server Driver][SQL Server] 打开软件提示上面的信息 此问题是由于sa账户在同一时间被多次登录&#x…

Oracle连接账户被锁:the account is locked 的解决办法

Oracle连接账户被锁&#xff1a;the account is locked 问题背景 在做配置文件数据库密码加密时&#xff0c;没注意做了一些骚操作&#xff0c;导致数据库被锁&#xff0c;网上找的资料都试了个遍&#xff0c;还是没用。浪费了两三个小时&#xff0c;差点都卸载重装数据库了。…

oracle提示“记录被另外一个用户锁定“

问题描述&#xff1a; 某人对某一条数据进行了修改&#xff0c;oracle会通过这个事务记住这条数据&#xff0c;若修改的人没有进行提交或进行回滚记录&#xff0c;oracle是不允许对这条数据在此进行修改的&#xff0c;在这种情况下你要进行修改数据&#xff0c;则会被阻止&…

ORACLE数据库 某用户账户被锁定问题解决

遇到的问题&#xff1a; [realestate][ERROR] [2022-05-17 14:27:11] com.alibaba.druid.pool.DruidDataSource$CreateConnectionThread.run(2469) | create connection SQLException, url: jdbc:p6spy:oracle:thin:172.18.13.83:1521/orclxj, errorCode 28000, state 99999 j…

Oracle账户被锁定后如何解锁

**原因&#xff1a;** 今天拉取了新的代码后&#xff0c;由于oracle数据库的配置忘记了更改&#xff0c;启动项目时一直连接不上数据库&#xff0c;改了两次后还是连接不上&#xff0c;最后只能启动一下没拉取代码前的项目&#xff0c;发现报了一个账户被锁定 ![在这里插入图片…

【饭谈】坚守自己的职业规划,给自己留一张底牌吧。

最近想必大家都被新出的chatGPT吓坏了吧&#xff1f;各种机构和博主跟风似的疯狂说gpt多厉害&#xff0c;会取代多少人&#xff0c;导致多少人下岗&#xff0c;各种Ai测试兴起等贩卖焦虑的言论。获得了很多的流量&#xff0c;也变现了很多。但却给全行业的打工人带来了恐惧心理…

深度:从工业救国到数字化兴国!

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 昨天&#xff0c;发生了两件事情&#xff0c;一喜一悲&#xff0c;喜的是颁布了《数字中国建设整体布局规划》&#xff1b;悲的是“改革先锋”厉以宁先生离开了我们。将这两件事情结合起来&#xff0c;让我们思考一个问题—…

AI大模型,救了 “低代码” 的命

作者| Mr.K 编辑| Emma 来源| 技术领导力(ID&#xff1a;jishulingdaoli) 著名技术哲学家安德鲁•费恩伯格教授&#xff0c;曾提过一个很有创意的概念&#xff0c;“技术民主化”。教授认为&#xff0c;技术民主就是扩大社会个体的自由边界&#xff0c;让大家积极有效地参与到…