随笔分类 -  [C++]树论-LCA,最近公共祖先

摘要:题面 洛谷 Bzoj 题解 很容易想到$O(nk)$的树形$dp$吧,设$f[i]$表示处理完这$i$颗子树的最小花费,同时再设一个$mi[i]$表示$i$到根节点$1$路径上的距离最小值。于是有: $ f[i]=\sum min(f[son[i]], mi[son[i]]) $ 这样就有$40$分 阅读全文
posted @ 2018-12-24 08:09 water_mi 阅读(297) 评论(1) 推荐(0)
摘要:前言 ​ “倍增”,作为一种二进制拆分思想,广泛用于各中算法,如$ST$表,求解$LCA$等等...今天,我们仅讨论用该思想来求解树上两个节点的$LCA$(最近公共祖先) “倍增”是什么东西? ​ 倍增就是“成倍增加”的意思,比如$1$倍增后变成了$2$,$2$倍增后就变成了$4$,$4$变成$8$ 阅读全文
posted @ 2018-10-15 21:26 water_mi 阅读(1717) 评论(2) 推荐(0)
摘要:​ 这是一道$Kruskal$重构树的板子题,因为$Kruskal$重构树满足两节点的在原树上路径上边最大/小值为这两个点在重构树上的$LCA$的点权 cpp include include using std::swap; using std::sort; typedef long long ll 阅读全文
posted @ 2018-10-15 20:21 water_mi 阅读(170) 评论(0) 推荐(0)
摘要:1.前言 首先我们介绍的算法是LCA问题中的离线算法-Tarjan算法,该算法采用DFS+并查集,再看此算法之前首先你得知道并查集(尽管我相信你如果知道这个的话肯定是知道并查集的),Tarjan算法的优点在于相对稳定,时间复杂度也比较居中,也很容易理解(个人认为)。 2.思想 下面详细介绍一下Tar 阅读全文
posted @ 2017-12-02 17:09 water_mi 阅读(423) 评论(0) 推荐(0)
摘要:1.前言 最近公共祖先(Least Common Ancestors),简称LCA,是由Tarjan教授(对,又是他)提出的一种在有根树中,找出某两个结点u和v最近的公共祖先问题。 2.什么是最近公共祖先? 在一棵树中,每个结点都有他的父亲和祖先,而最近公共祖先就是两个节点在这棵树上深度最大的公共的 阅读全文
posted @ 2017-11-02 21:20 water_mi 阅读(605) 评论(0) 推荐(0)