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

浙公网安备 33010602011771号