LCA题目总结

推荐技术公众号:不爱睡觉的大猪

 

好像LCA的题目并不多,现在就做了10道左右,但是找不到别的了,在此做个小总结,将来有更好的题目会不断更新

解决LCA问题,一般用3种方法

1.朴素方法:两个点都一直沿路径往上走,直到有某一个节点被经过两次并且是第一次出现这样的点,那么这个就是LCA

此方法最好理解,但是用得不多,但不代表没作用,有些题目还是需要用到的

2.LCA转RMQ(在线算法):一般是将LCA转为RMQ问题,用ST算法求解,当然求解RMQ问题有很多方法,不过ST比较常用而已,这样做能及时回答每一个询问

3.Tarjan算法(离线算法):利用Tarjan算法,不过要先读入所有询问再一并回答,建议认真学习Tarjan算法本质

 

******具体问题具体分析,但是可以使用Tarjan算法的时候推荐使用Tarjan算法,代码量少速度快,另外Tarjan算法容易产生变形,值得深究*************

 

hdu 2586 How far away ?

模板题,直接求LCA,可以在线,离线算法均可解,可以测试一下模板

 

poj 1986 Distance Queries

模板题,直接求LCA

 

hdu 2874 Connections between cities

模板题,不过不是树是森林,所以某些点不存在LCA,要做判断

 

zoj 3195 Design the city

任然算是模板题,上面的题要求两点间的最短距离,这里要求3点间的最短距离,其实就是两两之间求一次LCA并计算出距离,然后相加除以2即可

 

hdu 3078 Network

LCA + 修改点权值 + 排序:每个点有初始的权值,一边查询一边伴随着修改某些点的权值,查询是从a到b路径中第k大的权值是多少。不需要太多的技巧,修改操作就直接修改,查询操作先求LCA,然后从a走到b保存下所有的权值,排序,然后直接输出即可

 

poj 2763 Housewife Wind

LCA + 修改边权:一边查询两点间的距离,一边修改某些边权。对于修改了某些边的边权,就要从此开始遍历下面的子孙后代更改他们的dir值(点到根的距离)。也不需要太多技巧,直接按题意实现即可,不过时间比较糟糕,用线段树或树状数组可以对修改操作进行优化,时间提升很多

 

poj 3694 Network

连通分量 + LCA : 先缩点,再求LCA,并且不断更新,这题用了朴素方法来找LCA,并且在路径上做了一些操作

 

poj 3417 Network

LCA + Tree DP  :  在运行Tarjan处理完所有的LCA询问后,进行一次树DP,树DP不难,但是要想到用树DP并和这题结合还是有点难度

 

poj 3728 The merchant

LCA + 并查集的变形,优化:好题,难题,思维和代码实现都很有难度,需要很好地理解Tarjan算法中并查集的本质然后灵活变形,需要记录很多信息(有点dp的感觉)

 

hdu 3830 Checkers

LCA + 二分:好题,有一定思维难度。先建立出二叉树模型,然后将要查询的两个点调整到深度一致,然后二分LCA所在的深度,然后检验

posted @ 2013-06-14 10:20  Titanium  阅读(6589)  评论(0编辑  收藏  举报