热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

LCA倍增算法常见误区及优化模板分析

本文深入剖析了LCA倍增算法中常见的误区,并通过具体的错误代码示例,详细解释了这些误区的成因及其对算法性能的影响。在此基础上,文章提出了一种优化的模板实现方法,旨在提高算法的效率和稳定性,适用于大规模数据处理场景。

先上我原来的错误的代码

typenode&#61;^link;link&#61;recordnum:int64;next:node;end;varfa:array[0..300000,0..100] of int64;dep:array[0..300000] of int64;nd:array[0..300000] of node;b:array[0..300000] of boolean;dl:array[0..300000] of int64;n,m,maxdep,ans,t1,t2:int64;i:longint;procedure maketree;vart1,t2,head,tail:int64;i,j:longint;p:node;beginfor i:&#61;0 to n dob[i]:&#61;false;for i:&#61;1 to n-1 dobeginread(t1,t2);new(p);p^.num:&#61;t2;p^.next:&#61;nd[t1];nd[t1]:&#61;p;new(p);p^.num:&#61;t1;p^.next:&#61;nd[t2];nd[t2]:&#61;p;end;new(p);head:&#61;1;tail:&#61;1;dl[head]:&#61;1;b[1]:&#61;true;while head<&#61;tail dobeginp:&#61;nd[dl[head]];while p<>nil dobeginif b[p^.num]&#61;false thenbegininc(tail);dl[tail]:&#61;p^.num;fa[p^.num,0]:&#61;dl[head];dep[p^.num]:&#61;dep[dl[head]]&#43;1;b[p^.num]:&#61;true;if dep[p^.num]>maxdep then maxdep:&#61;dep[p^.num];end;p:&#61;p^.next;end;inc(head);end;for j:&#61;1 to trunc(ln(maxdep)/ln(2))&#43;1 dofor i:&#61;0 to n doif dep[i]>&#61;1<thenfa[i,j]:&#61;fa[fa[i,j-1],j-1];end;procedure lca(a,b:longint);vari,t:longint;beginif dep[a]>dep[b] thenbegint:&#61;a;a:&#61;b;b:&#61;t;end;if dep[a]<>dep[b] thenfor i:&#61;trunc(ln(dep[b]-dep[a])/ln(2)) downto 0 doif dep[b]-1<&#61;dep[a] thenbeginb:&#61;fa[b,i];ans:&#61;ans&#43;1<<i;end;if a<>b thenfor i:&#61;trunc(ln(dep[a])/ln(2)) downto 0 doif fa[a,i]<>fa[b,i] thenbegina:&#61;fa[a,i];b:&#61;fa[b,i];ans:&#61;ans&#43;1<<(i&#43;1);end;if a<>b then inc(ans,2);end;beginreadln(n);if n&#61;1 thenbeginwriteln(0);halt; end;maketree;readln(m);read(t1);for i:&#61;2 to m dobeginread(t2);lca(t1,t2);t1:&#61;t2;end;writeln(ans);end.

这个写法WA了一个点&#xff0c;答案比标准答案大。

最后发现可能是ln出现了误差&#xff0c;导致结果偏小&#xff0c;使两点无法移到同层。在后面的移动中无论怎样都无法移到同点&#xff0c;使答案比原来大二

 

改正后的模板

typenode&#61;^link;link&#61;recordnum:int64;next:node;end;varfa:array[0..300000,0..100] of int64;dep:array[0..300000] of int64;nd:array[0..300000] of node;b:array[0..300000] of boolean;dl:array[0..300000] of int64;n,m,maxdep,ans,t1,t2:int64;i:longint;procedure maketree;vart1,t2,head,tail:int64;i,j:longint;p:node;beginfor i:&#61;0 to n dob[i]:&#61;false;for i:&#61;1 to n-1 dobeginread(t1,t2);new(p);p^.num:&#61;t2;p^.next:&#61;nd[t1];nd[t1]:&#61;p;new(p);p^.num:&#61;t1;p^.next:&#61;nd[t2];nd[t2]:&#61;p;end;new(p);head:&#61;1;tail:&#61;1;dl[head]:&#61;1;b[1]:&#61;true;while head<&#61;tail dobeginp:&#61;nd[dl[head]];while p<>nil dobeginif b[p^.num]&#61;false thenbegininc(tail);dl[tail]:&#61;p^.num;fa[p^.num,0]:&#61;dl[head];dep[p^.num]:&#61;dep[dl[head]]&#43;1;b[p^.num]:&#61;true;if dep[p^.num]>maxdep then maxdep:&#61;dep[p^.num];end;p:&#61;p^.next;end;inc(head);end;for j:&#61;1 to trunc(ln(maxdep)/ln(2))&#43;1 dofor i:&#61;0 to n doif dep[i]>&#61;1<thenfa[i,j]:&#61;fa[fa[i,j-1],j-1];end;procedure lca(a,b:longint);vari,t:longint;beginif dep[a]>dep[b] thenbegint:&#61;a;a:&#61;b;b:&#61;t;end;if dep[a]<>dep[b] thenfor i:&#61;trunc(ln(dep[b]-dep[a])/ln(2))&#43;10 downto 0 doif dep[b]-1<&#61;dep[a] thenbeginb:&#61;fa[b,i];ans:&#61;ans&#43;1<<i;end;if a<>b thenfor i:&#61;trunc(ln(dep[a])/ln(2))&#43;10 downto 0 doif fa[a,i]<>fa[b,i] thenbegina:&#61;fa[a,i];b:&#61;fa[b,i];ans:&#61;ans&#43;1<<(i&#43;1);end;if a<>b then inc(ans,2);end;beginreadln(n);if n&#61;1 thenbeginwriteln(0);halt; end;maketree;readln(m);read(t1);for i:&#61;2 to m dobeginread(t2);lca(t1,t2);t1:&#61;t2;end;writeln(ans);end.

 

转:https://www.cnblogs.com/zhujiangning/p/5252868.html



推荐阅读
  • 本周,我深入研究了 ECharts 插件的使用方法,整体感觉插件操作较为简便,但后台算法较为复杂。此外,我还学习了 MySQL 函数的新应用,进一步提升了数据库操作的灵活性。同时,分享了自己在 Python 书籍外借过程中的体验,总结了一些实用的借阅技巧和心得。 ... [详细]
  • 如何在Spark数据排序过程中有效避免内存溢出(OOM)问题
    本文深入探讨了在使用Spark进行数据排序时如何有效预防内存溢出(OOM)问题。通过具体的代码示例,详细阐述了优化策略和技术手段,为读者在实际工作中遇到类似问题提供了宝贵的参考和指导。 ... [详细]
  • 深入解析斐波那契数列的算法原理与应用
    本文深入探讨了斐波那契数列的算法原理及其广泛应用。通过递归和动态规划两种方法,详细解析了斐波那契数列的生成过程,并提供了高效的实现代码。此外,文章还讨论了斐波那契数列在计算机科学、数学建模以及自然界中的实际应用,展示了其在优化算法设计和解决复杂问题中的重要性。 ... [详细]
  • 本文详细探讨了Java集合框架的使用方法及其性能特点。首先,通过关系图展示了集合接口之间的层次结构,如`Collection`接口作为对象集合的基础,其下分为`List`、`Set`和`Queue`等子接口。其中,`List`接口支持按插入顺序保存元素且允许重复,而`Set`接口则确保元素唯一性。此外,文章还深入分析了不同集合类在实际应用中的性能表现,为开发者选择合适的集合类型提供了参考依据。 ... [详细]
  • 本文介绍了如何通过掌握 IScroll 技巧来实现流畅的上拉加载和下拉刷新功能。首先,需要按正确的顺序引入相关文件:1. Zepto;2. iScroll.js;3. scroll-probe.js。此外,还提供了完整的代码示例,可在 GitHub 仓库中查看。通过这些步骤,开发者可以轻松实现高效、流畅的滚动效果,提升用户体验。 ... [详细]
  • 在处理大规模并发请求时,传统的多线程或多进程模型往往无法有效解决性能瓶颈问题。尽管它们在处理小规模任务时能提升效率,但在高并发场景下,系统资源的过度消耗和上下文切换的开销会显著降低整体性能。相比之下,Python 的 `asyncio` 模块通过协程提供了一种轻量级且高效的并发解决方案。本文将深入解析 `asyncio` 模块的原理及其在实际应用中的优化技巧,帮助开发者更好地利用协程技术提升程序性能。 ... [详细]
  • 算法专题:罗马数字转换为整数详解与实现 ... [详细]
  • Java Web开发中的JSP:三大指令、九大隐式对象与动作标签详解
    在Java Web开发中,JSP(Java Server Pages)是一种重要的技术,用于构建动态网页。本文详细介绍了JSP的三大指令、九大隐式对象以及动作标签。三大指令包括页面指令、包含指令和标签库指令,它们分别用于设置页面属性、引入其他文件和定义自定义标签。九大隐式对象则涵盖了请求、响应、会话、应用上下文等关键组件,为开发者提供了便捷的操作接口。动作标签则通过预定义的动作来简化页面逻辑,提高开发效率。这些内容对于理解和掌握JSP技术具有重要意义。 ... [详细]
  • Python编程入门:3.11.1 版本中的Collatz序列解析与实践
    在Python 3.11.1版本中,通过编写一个名为`collatz()`的函数来解析和实践Collatz序列。该函数接受一个名为`number`的参数:如果`number`是偶数,则函数将输出`number // 2`并返回该值;如果`number`是奇数,则输出和返回`3 * number + 1`。这一过程有助于理解递归函数和条件逻辑在Python中的应用。 ... [详细]
  • iOS开发中MVC架构模式的深入解析(第一部分)
    在iOS开发中,MVC架构模式是常用的设计模式之一。本文将深入解析MVC架构的第一部分,重点介绍View组件。View组件继承自UIView,主要负责内容的展示(如UILabel等视图类)和用户输入的处理(如UIButton等控件类)。通过详细的代码示例和实际应用,帮助开发者更好地理解和掌握View在MVC架构中的作用和实现方式。 ... [详细]
  • PHP中元素的计量单位是什么? ... [详细]
  • 深入解析经典卷积神经网络及其实现代码
    深入解析经典卷积神经网络及其实现代码 ... [详细]
  • 本文详细解析了神州数码DCRS5980交换机的基础配置流程和技术要点。首先,通过进入配置模式(`enable`),设置主机名(`hostname 5980`),并创建VLAN,逐步介绍了设备的初始设置步骤。此外,还涵盖了端口配置、IP地址分配及安全设置等关键环节,为用户提供了全面的配置指导。 ... [详细]
  • 深入解析Gradle中的Project核心组件
    在Gradle构建系统中,`Project` 是一个核心组件,扮演着至关重要的角色。通过使用 `./gradlew projects` 命令,可以清晰地列出当前项目结构中包含的所有子项目,这有助于开发者更好地理解和管理复杂的多模块项目。此外,`Project` 对象还提供了丰富的配置选项和生命周期管理功能,使得构建过程更加灵活高效。 ... [详细]
  • 可转债数据智能抓取与分析平台优化
    本项目旨在优化可转债数据的智能抓取与分析平台。通过爬取集思录上的可转债信息(排除已发布赎回的债券),并结合安道全教授提出的三条安全线投资策略,新增了建仓线、加仓线和重仓线,以提供更精准的投资建议。 ... [详细]
author-avatar
天王2502871933
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有