基环树专题

20191028 专题:基环树最长链 先上模板题 (黑的???) 自己 做的第一道 黑题,先祭一波~~~ 做了3h …毕竟我还是太弱了。 T1 P4381 [IOI2008]Island (洛谷P4381) 题目描述 你准备浏览一个公园,该公园由 NN 个岛屿组成,当地管理部门从每个岛屿 ii 出发向另外一个岛屿建了一座长度为LiL_iLi​的桥,不过桥是可以双向行走的。同时,每对岛屿之间都有一艘专用的往来两岛之间的渡船。相对于乘船而... 阅读详情

基环树专题

最近公共祖先

A c w i n g   392 Acwing~392 Acwing 392

const int MaxN=5e5+1e4;

int Head[MaxN],Dp[MaxN][21],Belong[MaxN],Dad[MaxN];
inline int GetDad(int x){
	return x==Dad[x]?x:Dad[x]=GetDad(Dad[x]);
}
inline void Union(int x,int y){
	x=GetDad(x);y=GetDad(y);
	if(x!=y)Dad[x]=y;
}
bool Visit[MaxN],InSta[MaxN];
int Root[MaxN],Dep[MaxN],Sum[MaxN];
inline void Dfs(int from){
	Visit[from]=InSta[from]=true;
	if(InSta[Dp[from][0]]==true){
		int cnt=0,now=Dp[from][0];
		while(true){
			Root[now]=now;Dep[now]=0;Head[now]=from;
			InSta[now]=false;Sum[now]=++cnt;
			if(now==from)break;
			now=Dp[now][0];
		}
		return;
	}
	if(!Visit[Dp[from][0]])Dfs(Dp[from][0]);
	if(!Root[from]){
		Root[from]=Root[Dp[from][0]];
		Dep[from]=Dep[Dp[from][0]]+1;
		InSta[from]=false;
	}
	for(register int i=1;i<=20;i++)
		Dp[from][i]=Dp[Dp[from][i-1]][i-1];
}

inline int GetLca(int x,int y){
	if(Dep[x]<Dep[y])Swap(x,y);
	for(register int i=20;i>=0;i--)
		if(Dep[Dp[x][i]]>=Dep[y])
			x=Dp[x][i];
	if(x==y)return x;
	for(register int i=20;i>=0;i--)
		if(Dp[x][i]!=Dp[y][i])
			x=Dp[x][i],y=Dp[y][i];
	return Dp[x][0];
}
int n,q;
int main(){
	scanf("%d%d",&n,&q);
	for(register int i=1;i<=n;i++)
		Dad[i]=i;
	for(register int i=1;i<=n;i++)
		scanf("%d",&Dp[i][0]),Union(i,Dp[i][0]);
	for(register int i=1;i<=n;i++)
		if(!Visit[i])Dfs(i);
	for(register int Test=1,x,y;Test<=q;Test++){
		scanf("%d%d",&x,&y);
		if(GetDad(x)!=GetDad(y))puts("-1 -1");
		else if(Root[x]==Root[y]){
			int p=GetLca(x,y);
			printf("%d %d\n",Dep[x]-Dep[p],Dep[y]-Dep[p]);
		}
		else{
			int a=Dep[x],b=Dep[y],Cx,Cy;
			Cx=abs(Sum[Root[x]]-Sum[Root[y]]);
			Cy=Sum[Head[Root[x]]]-Cx;
			if(Sum[Root[x]]<Sum[Root[y]])Swap(Cx,Cy);
			if(Max(Cx+a,b)<Max(a,Cy+b)||(Max(Cx+a,b)==Max(a,Cy+b)&&(Min(a+Cx,b)<Min(a,b+Cy)||(Min(a+Cx,b)==Min(a,b+Cy)&&a+Cx>=b))))
				printf("%d %d\n",Cx+a,b);
			else printf("%d %d\n",a,b+Cy);
		}
	}
	return 0;
} 

直径

const int MaxN=1e6+1e5;
const int MaxM=2e6+1e5;
Graphs<long long,MaxN,MaxM>G;
bool Visit[MaxN],Mark[MaxN],flag;
int Pre[MaxN];
vector<Pairs<int,long long> >Ring;
inline void GetRing(int from,int last){
	Visit[from]=true;
	for(register int k=G.Last[from];k!=-1;k=G.Next[k]){
		if((k^1)==last)continue;
		if(flag&&Visit[G.To[k]])continue;
		if(Visit[G.To[k]]){
			int now=k^1;
			do{
				Ring.push_back(Pairs<int,long long>(G.To[now],G.Cost[now]));
				Mark[G.To[now]]=true;now=Pre[G.To[now]];
			}while(G.To[k]!=G.To[now]);
			Ring.push_back(Pairs<int,long long>(G.To[now],G.Cost[now]));
			Mark[G.To[now]]=true;flag=true;
			continue;
		} 
		Pre[G.To[k]]=k^1;
		GetRing(G.To[k],k);
	}
}
long long res,Dist[MaxN];
inline void Dfs(int from,int dad){
	for(register int k=G.Last[from];k!=-1;k=G.Next[k]){
		if(G.To[k]==dad||Mark[G.To[k]])continue;
		Dfs(G.To[k],from);
		res=Max(res,Dist[from]+Dist[G.To[k]]+G.Cost[k]);
		Dist[from]=Max(Dist[from],Dist[G.To[k]]+G.Cost[k]);
	}
}
int Queue[MaxM],head,tail;
long long Arr[MaxM],Sum[MaxM];
inline void Solve(){
	int sizer=Ring.size();
	for(register int i=0;i<sizer;i++){
		Dfs(Ring[i].x,0);
		Arr[i]=Dist[Ring[i].x];
		Sum[i]=Ring[i].y;
	}
	memcpy(Arr+sizer,Arr,sizer*sizeof(long long));
	memcpy(Sum+sizer,Sum,sizer*sizeof(long long));
	head=tail=0;
	for(register int k=0;k<2*sizer;k++){
		Sum[k]+=Sum[k-1];
		while(head!=tail&&k-Queue[head]>=sizer)head++;
		if(head!=tail)
			res=Max(res,Arr[Queue[head]]+Arr[k]+Sum[k]-Sum[Queue[head]]);
		while(head!=tail&&Arr[k]-Sum[k]>=Arr[Queue[tail-1]]-Sum[Queue[tail-1]])tail--;
		Queue[tail++]=k;
	}
}
inline void ReInit(){
	flag=false;
	Ring.clear();
	res=0;
}
int n;
int main(){
	Read(n);
	for(register int i=1,x,y;i<=n;i++){
		Read(x,y);
		Insert(G,i,x,1ll*y);Insert(G,x,i,1ll*y);
	}
	long long ans=0;
	for(register int i=1;i<=n;i++){
		if(Visit[i])continue;
		ReInit();
		GetRing(i,Inf);
		Solve();
		ans+=res;
	}
	printf("%lld",ans);
	return 0;
}
Wallace树专题研究 Wallace树乘法器专题研究 绪论:在乘法器的设计中采用树形乘法器,可以减少关键路径和所需的加法器单元数目,Wallace树乘法器就是其中的一种。下面以一个4*4位乘法器为例介绍Wallace树乘法器及其Verilog HDL实现。 原理:Wallace树乘法器的运算原理如下: 从数据最密集的地方开始,不断的反复使用全加器、半加器来覆盖“树”。全加器是一个3输入2输出的器件,因此全加器又称... 阅读详情

相关推荐

基环树与笛卡尔树:从找环到单调栈的算法实战解析

树形结构是算法竞赛与工程问题中抽象的基石。当图比普通树多出一条边,便形成基环树;而序列的偏序关系可以压缩成满足堆性质的笛卡尔树。理解两者的底层原理,能大幅降低复杂问题的求解难度。基环树通过拓扑删叶或DFS找环,再以断环为链的技巧将环上的树形DP转化为线性DP;笛卡尔树则利用单调栈在O(n)时间内建树,将静态RMQ转换为LCA查询,并在直方图最大矩形等问题中展现高效价值。这两种结构看似分属图论与数据结构,但核心都在于识别问题的骨架后,用树形DP或单调栈完成状态转移。本文结合实战中的递归爆栈、初始化陷阱与相等元

weixin_29611239的博客 334

基环树学习笔记

在机♂房当然要搞搞基♂环树啦 基环树就是一个$n$个点,$n$条边的图 由于多了一条边,就不是树了,但由于只多了一条边,所以可以有神奇的方法搞它 一般来讲,把那个环当成根,把基环树看成许多的 根连成一个环的树,对于每个树进行树形DP,然后在环上再DP一下就好了 那么来看看例题 IOI2008 Island 这好像是一部很不错的同名的番呀 题目链接 题目大意:求基环树...

a380988182的博客 265

基环树与笛卡尔树:从树形DP到单调栈建树的进阶指南

树形结构是算法竞赛与工程面试中的常客,而基环树和笛卡尔树则是从基础迈向进阶的两类重要模型。基环树本质是比树多一条边的连通图,常出现在依赖关系、互斥选择等场景,核心思路是“先拆环再DP”,通过拓扑删叶或DFS找环,将环上节点转化为子树问题处理。笛卡尔树则利用数组序列构建二叉树,满足中序遍历与堆性质,借助单调栈可在线性时间内完成建树,常用于区间最值、直方图最大矩形以及RMQ结构同构判断。理解这两类结构的原理,不仅能够提升对图与序列的抽象能力,还能将复杂问题拆解为可递推处理的子树或链式问题。本文基于实际调试经验,

weixin_42535703的博客 320

最大独立集专题

最大独立集专题 本文着重介绍一些特别的图的有关最大独立集的问题。 part1.树上最大独立集 例题:没有上司的舞会 题目描述 某大学有N个职员,编号为1~N。他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司。现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri,但是呢,如果某个职员的上司来参加舞会了,那么这个职员就无论如何也不肯来参加...

weixin_30511039的博客 697

【图论】【基环内向树】【广度优先】【深度优先】2127. 参加会议的最多员工数

一个公司准备组织一场会议,邀请名单上有 n 位员工。公司准备了一张 圆形 的桌子,可以坐下 任意数目 的员工。 员工编号为 0 到 n - 1 。每位员工都有一位 喜欢 的员工,每位员工 当且仅当 他被安排在喜欢员工的旁边,他才会参加会议。每位员工喜欢的员工 不会 是他自己。 给你一个下标从 0 开始的整数数组 favorite ,其中 favorite[i] 表示第 i 位员工喜欢的员工。请你返回参加会议的 最多员工数目 。

闻缺陷则喜何志丹 1073

【Python・统计学】(两)多因素方差分析(原理及代码)

自学笔记,分享给对统计学原理不太清楚但需要在论文中用到的小伙伴,欢迎大佬们补充或绕道。ps:本文不涉及公式讲解(文科生小白友好体质)~(部分定义等来源于知乎) 本文重点:多因素方差分析 【1.多因素方差分析简单原理】 【2.多因素方差分析步骤】 【3.多因素方差分析代码】

TUTO_TUTO的博客 4864

树形dp小总结(换根,基环树,杂七杂八的dp)

脑子是个好东西,可惜我有的不多。。。从小到大都是看见树就头皮发麻,前阵子学的多了稍微好一点,但是经过一个树专题的洗礼,熟悉的恐惧感又回来了。。。会讲一下换根dp,基环树dp,也许后面还会更一下树上背包之类的换根换根,就是对不同节点做根的情况进行讨论,通常就是在一些节点选择的题目里会出现,但是碰到的不多(lwh简单的不会考,难的,你们。。。.....................

sophilex的博客 789

避坑指南:LAMMPS做GCMC模拟时,化学势mu和压力p到底怎么设?

本文详细解析了LAMMPS中巨正则蒙特卡洛(GCMC)模拟的关键参数设置,特别是化学势(mu)与压力(p)的正确计算方法。通过理论分析、实用公式和黄金法则,帮助用户避免常见误区,提升模拟精度和效率,适用于各类复杂体系的分子模拟研究。

weixin_42525289的博客 429

基环树 最大独立集

基环树,也是环套树,简单地讲就是树上在加一条边。它形如一个环,环上每个点都有一棵子树的形式。因此,对基环树的处理大部分就是对树处理和对环处理。显然,难度在于后者。 在基环树中,它可以选择叶子,并删除他们的邻接点并重复该过程,就可以直到剩下环。 解决这类问题一般都是去拆环,变一般树来处理。 题目:COCI2014/2015 Contest#1 D MAFIJA【基环树最大独立点集】 - Tieechal - 博客园 (cnblogs.com) COCI2014/2015 Contest#1 D MAFIJA

rickwang000的博客 480

决策大模型与生成式大模型有何不同?一文拆解技术框架与落地路径

大模型技术正从内容生成走向复杂场景的智能决策。与生成式大模型拟合概率分布不同,决策大模型以序列决策为核心,融合强化学习机制,在动态环境中感知反馈、持续修正行动路径。其技术框架涵盖语义理解、规划推理与闭环决策,并通过世界模型进行低成本仿真推演,显著提升供应链调度、物流排程等场景的应对效率。实际落地时需结合传统优化算法与人工兜底,构建“语义先导+数值寻优”的分层架构,才能平衡精度与稳定性。这篇内容拆解决策大模型的技术组成、落地路径与常见误区,为企业智能化转型提供可参考的实践框架。

weixin_29057163的博客 188

以太网_RGMII接口与GMII接口的转化_03

RGMII接口转GMII接口!

weixin_42499230的博客 378

基环树DP入门:骑士问题与最大权独立集详解

动态规划是算法竞赛中的核心思想,而树形DP解决的是树上的最优决策问题。当图中出现环时,问题便升级为基环树DP,此时需要先通过拓扑排序找出环,再将环拆开转化为树形结构处理。基环树DP广泛应用于最大权独立集、最优选点等场景,例如经典的“骑士”问题:每个骑士讨厌另一个人,构成一张基环树,求解战斗力总和最大且互不攻击的选择方案。本文详细讲解函数图性质、找环拆环、树形DP与环形DP结合的完整流程,并给出C++代码实现和常见坑点,帮助读者系统掌握这一类高频算法模型。

weixin_30444111的博客 236

YOLOv13安装教程 手把手教你融合空间注意力机制(SAB)的RAB卷积模块 自动“聚焦”重要的特征 map指标提升8.96,准确率提升3.56

本文提出了一种改进的YOLOv13目标检测模型,通过引入RAB(残差注意力模块)显著提升了检测性能。实验结果显示,添加RAB模块后,mAP指标提升了8.96,准确率提高了3.56%。文章详细介绍了RAB模块的实现方法:1)采用多级残差连接增强特征提取能力;2)结合空间注意力机制(SAB)自动聚焦关键区域;3)通过1×1卷积实现通道维度压缩与恢复。同时提供了完整的模型移植方案,包括配置文件修改、任务处理代码调整以及模块实现细节,为YOLO系列模型的性能优化提供了有效参考。

FJN110的博客 646

【BZOJ1040】[ZJOI2008] 骑士(基环外向树DP)

点此看题面 大致题意: 给你一片基环外向树森林,如果选定了一个点,就不能选择与其相邻的节点。求选中点的最大权值和。 树形DPDPDP 此题应该是**树形DPDPDP**的一个升级版:基环外向树DPDPDP。 LinkLinkLink 树形DPDPDP 详见博客 动态规划专题(二)——树形DP 什么是基环外向树森林 什么是 基环外向树? 基环外向树,一般指一张 点数与边数相等 的联通图,此时...

CXR的博客 351

揭秘LLM如何预测下一个词

Transformer结构的大语言模型(LLM)通过自回归训练学习预测下一个词汇,其核心能力源自权重矩阵的动态优化。自注意力层的Wq/Wk/Wv矩阵捕捉语义关联,前馈网络的W1/W2矩阵进行非线性特征提取,LM Head的W_{lm}矩阵将语义映射到词汇概率。训练过程中,这些矩阵通过反向传播不断调整,最终使模型能够根据上下文(如"我"→"爱")生成合理的后续词汇。这种基于矩阵变换的数学机制是LLM智能生成文本的本质原因。(150字)

ZhangJiqun&191cm&85kg 376

【IC前端虚拟项目】spyglass lint环境组织与lint清理

和上个虚拟项目的lint清理环节一样,关于spyglass的lint清理功能与流程还是大家通过各种资料去学习下就好啦。和之前不同的事,这次的虚拟项目里我把流程封装为Makefile,更加的贴近了实际项目交付流程。而后就可以根据提示进行lint的清理工作了。

moon9999的博客 1886

基环树路径最大和:扫地机器人背后的图论与动态规划

图论中,树与环的组合结构常出现在路径优化问题里,这类结构被称为基环树。现实里的机器人清扫路线、园区巡检调度,往往需要在带环地图上寻找收益最大的无重复路径。解决此类问题,通常先用树形DP计算子树内最优路径,再用拓扑排序剥除树枝快速定位环,最后将环展开为两倍数组,借助单调队列优化跨环路径枚举,从而在线性时间内得到全局最优解。本文以扫地机器人路径收益最大化为场景,完整拆解基环树上最大路径和的计算过程,包括状态转移、环序列化、滑动窗口边界等易错细节,为算法竞赛选手和路径规划开发者提供可复用的实现思路。

weixin_33552698的博客 209

核心面试聚焦:业务问题+系统问题+设计题---字节、阿里、美团等整理统计

业务系统及其他相关面试问题整理:线上相关问题排查+高并发系统的限流+高并发秒杀系统设计+负载均衡+一个网站有 20 亿 url 存在一个黑名单中,这个黑名单要怎么存?若此时随便输入一个 url,你如何快速判断该 url 是否在这个黑名单中?并且需在给定内存空间(比如:500M)内快速判断出?

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 172万+

内向基环森林 + 拓扑排序:LeetCode 2127「参加会议的最多员工数」深度题解(LogicStack-LeetCode 系列)

本篇是 LogicStack-LeetCode 仓库「刷穿 LeetCode」系列中 2127. 参加会议的最多员工数(困难) 一文的深度展开。它以「圆桌排座」为背景,本质是一道**内向基环森林(Functional Graph)**上的最优化问题:每个员工只有一条"喜欢"出边,如何从这张图中挑选出最多的人围成一圈。读完本文,你将掌握基环树/内向基环森林的核心概念、用拓扑排序剥离环外链的标准套路,

gitblog_00758的博客 863

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

LeetCode专题——树

LeetCode专题——树 一、前提 正如一句老话所说——磨刀不误砍柴功,在为面试或者复试准备算法题的时候,尽量先不要直接钢,直接钢的后果就是刷题进度缓慢,没有多大效果。 本人目前觉得较好的一个方法是一个个专题的刷,先根据专题刷一些简单或中等难度的题目,熟悉或者背诵相关模板,在能力达到一定级别后,去刷一刷周赛,随机做一做题目。 那么为什么我本次算法复习之路从树这一专题刷起,主要是如下考虑: 树的结构可以用链表或线性表的方式保存,这样我们先开始刷 树专题,等于可以复习链表和线性表的一些知识点。 一些算法,比

阿超的博客 398

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

基环树路径最大和:扫地机器人场景中的树形DP与环处理

树形结构是算法竞赛与工程面试中的基础,而在n个点n条边的图里,比普通树多出一条边,便形成了独特的基环树。理解基环树的组成与拆解方式,是从基础树形动态规划迈向复杂图论建模的关键一步。求解基环树上的简单路径最大和,通常需要将问题拆成两个阶段:先用树形DP处理每个环节点挂载的外向树,再把环展开为线性序列,借助前缀和与单调队列合并最优解。这种“先拆树、后断环成链”的思路具有很强泛化能力,可迁移至基环树的直径、最大独立集等变体问题。扫地机器人清扫路线映射出的商业场景,正是该算法模型在路径规划中的有趣落地,掌握它能系统

weixin_31856057的博客 185

树专题

树专题一个中心两个基本点深度优先遍历广度优先遍历三种题型搜索类Offer 34.** **二叉树中和为某一值的路径1372. 二叉树中的最长交错路径构建类普通二叉树的构建二叉搜索树的构建修改类增加,删除节点,或者是修改节点的值或者指向。四个重要概念二叉搜索树完全二叉树路径124.二叉树中的最大路径和距离 一个中心 树的遍历迭代写法 其核心思想如下: 使用颜色标记节点的状态,新节点为白色,已访问的节点为灰色。 如果遇到的节点为白色,则将其标记为灰色,然后将其右子节点、自身、左子节点依次入栈。 如果遇到的节点为

anqi3776的博客 443

LeetCode 剑指 Offer II 前缀树(上) 专题总结

刷穿!!!剑指Offer ||

一只小逸白 1032

LeetCode 剑指 Offer II 树(上) 专题总结

LeetCode 剑指 Offer II 树(上) 专题总结,关注我,带你做穿剑指Offer ||

一只小逸白 1327

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 187
上一篇: P4408 [NOI2003] 逃学的小孩 题解
下一篇: 01分数规划专题
DarksideCoder
博客等级 码龄7年 34粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值