LCA(最近公共祖先)
eIectron
优美的代码是成功AC的第一步。看着那么多博客不再更新,这就是我几年后的状态吗?要是走了就再也不回来了。
展开
-
HDU 2586 How far away ?(LCA模板题)
恰好最近做了强联通,用tarjan比较多,所以就上tarjan的模版来做这题。看到别人用tarjan求LCA,用到low和dfn两个数组,我们要明白,low是用来记录某个点的根,dfn是记录某个点能获取到最高的根是多少。用tarjan求LCA的时候只需要low即可代码如下:#includeusing namespace std; const int maxn = 40005;原创 2017-07-19 09:52:59 · 234 阅读 · 0 评论 -
BZOJ 1787 Meet 紧急集合 (LCA)
这题很明显就是可以先两个lca,然后得到一个祖先p后再和另外一个,点进行lca得到三个点的最近公共祖先p2,此时三个点之间的距离其实已经求出来了,而这两个最近公共祖先p和p2里面,我们自然是选择深度较高的那个作为答案。然后一个三个数字一共三种这样的情况,枚举一下,不断更新答案即可。但是看了别人的做法发现有一种更加简单的方法,就是直接两两lca得到三个最近公共祖先p1,p2,p3,如果有两个原创 2017-09-04 11:57:13 · 325 阅读 · 0 评论 -
HDU 6203ping ping ping(LCA+贪心)
题意:给出一棵树,然后给出一些点对,要求这些点对无法连通(可以毁坏u到v路上的点,也可以毁坏u,也可以毁坏v)。问最少毁坏多少个点。解法:很容易想到,如果毁坏u和v的最近公共祖先,那么这条路是断的,而且u的子树上的点到v的子树上的点也会无法连通。但是单凭LCA是不够的,因为深度越大的应该优先解决,深度小的点无法影响深度大的点。所以我们要贪心一下,每次取出点对的LCA深度小的点对。如果这个点对u原创 2017-09-30 11:28:07 · 296 阅读 · 0 评论