博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 2586(最近公共祖先LCA)
阅读量:6925 次
发布时间:2019-06-27

本文共 680 字,大约阅读时间需要 2 分钟。

题目链接:

思路:在求解最近公共祖先的问题上,用到的是Tarjan的思想,从根结点开始形成一棵深搜树,非常好的处理技巧就是在回溯到结点u的时候,u的子树已经遍历, 这时候才把u结点放入合并集合中,这样u结点和所有u的子树中的结点的最近公共祖先就是u了,u和还未遍历的所有u的兄弟结点及子树中的最近公共祖先就是 u的父亲结点。以此类推。这样我们在对树深度遍历的时候就很自然的将树中的结点分成若干的集合,两个集合中的所属不同集合的任意一对顶点的公共祖先都是 相同的,也就是说这两个集合的最近公共最先只有一个。对于每个集合而言可以用并查集来优化,时间复杂度就大大降低了,为O(n + q),n为总结点数,q为询问结点对数。

一般步骤:

//parent为并查集,FIND为并查集的查找操作 //QUERY为询问结点对集合 //TREE为基图有根树  Tarjan(u)       visit[u] =true       for each (u, v) in QUERY           if visit[v]               ans(u, v) = FIND(v)       for each (u, v) in TREE              if!visit[v]               Tarjan(v)               parent[v] = u 对于本道题的做法就是用dist数组记录任意节点到根节点的距离,然后最终的答案就是dist[u,v]=dist[u]+dist[v]-2*dist[LCA(u,v)]。

转载地址:http://fedjl.baihongyu.com/

你可能感兴趣的文章
jqGrid细节备注—表格元素换行
查看>>
jquery实现数字滚动效果
查看>>
myeclipse反编译
查看>>
不要宗教化TDD(测试驱动开发)
查看>>
Exchange2013灾难恢复演练--Exchange管理员必须掌握的技能
查看>>
Linux系统内核网络参数的意义及应用(转贴)
查看>>
思维工具2: Reversal
查看>>
百度知道1000指数的关键词留链接排名到第一的实战案例
查看>>
《完美软件》笔记5:测试与除错的区别
查看>>
Windows Server 2012 R2域控和Exchange 2016 ALL IN ONE 推荐
查看>>
烂泥:学习ssh之ssh无密码登陆
查看>>
VS2010C++函数自动补全的插件
查看>>
ASP.NET 2.0打造购物车和支付系统之一
查看>>
天兔(Lepus)监控操作系统(OS)安装配置
查看>>
冒泡排序(bubble sort)算法实现
查看>>
MySQL TPCH测试工具简要手册
查看>>
演示:理解并配置不同权限的用户、设置时间(NTP服务)
查看>>
[CTO札记]网站核心业务对象分析
查看>>
如何将Markdown文章轻松地搬运到微信公众号并完美地呈现代码内容
查看>>
IronRuby - 编写自动化测试脚本
查看>>