热门标签 | 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



推荐阅读
  • 在OpenCV 3.1.0中实现SIFT与SURF特征检测
    本文介绍如何在OpenCV 3.1.0版本中通过Python 2.7环境使用SIFT和SURF算法进行图像特征点检测。由于这些高级功能在OpenCV 3.0.0及更高版本中被移至额外的contrib模块,因此需要特别处理才能正常使用。 ... [详细]
  • 线段树详解与实现
    本文详细介绍了线段树的基本概念及其在编程竞赛中的应用,并提供了一个具体的线段树实现代码示例。 ... [详细]
  • 问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中 ... [详细]
  • 洛谷 P4009 汽车加油行驶问题 解析
    探讨了经典算法题目——汽车加油行驶问题,通过网络流和费用流的视角,深入解析了该问题的解决方案。本文将详细阐述如何利用最短路径算法解决这一问题,并提供详细的代码实现。 ... [详细]
  • Requests库的基本使用方法
    本文介绍了Python中Requests库的基础用法,包括如何安装、GET和POST请求的实现、如何处理Cookies和Headers,以及如何解析JSON响应。相比urllib库,Requests库提供了更为简洁高效的接口来处理HTTP请求。 ... [详细]
  • 如何将955万数据表的17秒SQL查询优化至300毫秒
    本文详细介绍了通过优化SQL查询策略,成功将一张包含955万条记录的财务流水表的查询时间从17秒缩短至300毫秒的方法。文章不仅提供了具体的SQL优化技巧,还深入探讨了背后的数据库原理。 ... [详细]
  • 深入探讨前端代码优化策略
    本文深入讨论了前端开发中代码优化的关键技术,包括JavaScript、HTML和CSS的优化方法,旨在提升网页加载速度和用户体验。 ... [详细]
  • 为助力科研人员提升数据处理与图形展示能力,活动家携手北京市计算中心推出2017年R语言数据可视化研讨会。详情及注册信息请点击链接查看。 ... [详细]
  • 菜鸟物流用户增长部现正大规模招聘P6及以上级别的JAVA工程师,提供年后入职选项。 ... [详细]
  • Bootstrap Paginator 分页插件详解与应用
    本文深入探讨了Bootstrap Paginator这款流行的JavaScript分页插件,提供了详细的使用指南和示例代码,旨在帮助开发者更好地理解和利用该工具进行高效的数据展示。 ... [详细]
  • 实践指南:使用Express、Create React App与MongoDB搭建React开发环境
    本文详细介绍了如何利用Express、Create React App和MongoDB构建一个高效的React应用开发环境,旨在为开发者提供一套完整的解决方案,包括环境搭建、数据模拟及前后端交互。 ... [详细]
  • 本文详细介绍如何在华为鲲鹏平台上构建和使用适配ARM架构的Redis Docker镜像,解决常见错误并提供优化建议。 ... [详细]
  • 编译原理中的语法分析方法探讨
    本文探讨了在编译原理课程中遇到的复杂文法问题,特别是当使用SLR(1)文法时遇到的多重规约与移进冲突。文章讨论了可能的解决策略,包括递归下降解析、运算符优先级解析等,并提供了相关示例。 ... [详细]
  • 题目编号:2049 [SDOI2008]Cave Exploration。题目描述了一种动态图操作场景,涉及三种基本操作:断开两个节点间的连接(destroy(a,b))、建立两个节点间的连接(connect(a,b))以及查询两节点是否连通(query(a,b))。所有操作均确保图中无环存在。 ... [详细]
  • 最近遇到了一道关于哈夫曼树的编程题目,需要在下午之前完成。题目要求设计一个哈夫曼编码和解码系统,能够反复显示和处理多个项目,直到用户选择退出。希望各位大神能够提供帮助。 ... [详细]
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社区 版权所有