终于学了圆方树啦~\(≧▽≦)/~ 感谢y_immortal学长的博客和帮助 把他的博客挂在这里~ 点我传送到巨佬的博客QwQ! 首先我们来介绍一下圆方树能干什么呢qwq 1.将图上问题简化到树上问题 2.一般是路径并 3.资磁修改! 然后我们就可以步入正题来学习圆方树啦~ ——超良心圆方树教程!—— 这里是一个前缀芝士清单! 1.Tarjan求点双连通分量 2.树链剖分 如果你大体知道这两个东西在干什么 那你看接下来的教程就会非常熟练[大雾 一.圆方树的构造 原图中的点称为原点 新建的点称为方…
QWQ果然我已经什么都学不会的人了. 这个题目要求的是图上所有路径的点权和!QWQ(我只会树上啊!) 这个如果是好啊 这时候就需要 圆方树! 首先在介绍圆方树之前,我们先来一点简单的前置知识 首先,我们需要知道什么是 点双联通分量 若一个无向图中的去掉任意一个节点都不会改变此图的连通性,即不存在割点,则称作点双连通图.那么一个极大的点双联通子图,就是一个双联通分量了 那么求这个方法,和普通求割点的\(tarjan\)类似 用一个栈维护所有的点 对于搜索到一个割点,然后把他的栈内部的点依次弹栈,直…
仙人掌&圆方树学习笔记 1.仙人掌 圆方树用来干啥? --处理仙人掌的问题. 仙人掌是啥? (图片来自于\(BZOJ1023\)) --也就是任意一条边只会出现在一个环里面. 当然,如果你的图片想看起来舒服一点,也可以把图片变成这样子 (图片来源于网络) 2.DFS树 为啥要写这个?--因为这个看起来也可以解决一些仙人掌的问题. 对于一个仙人掌,我们随便构建出一棵生成树. 然后我们就多了一些边--可以叫返祖边,非树边--你想叫啥就叫啥. 因为每条边只会出现在一个环中, 所以每一条返祖边覆盖了树中…
[CF487E]Tourists(圆方树) 题面 UOJ 题解 首先我们不考虑修改,再来想想这道题目. 我们既然要求的是最小值,那么,在经过一个点双的时候,走的一定是具有较小权值的那一侧. 所以说,我们可以让所有的方点表示它所在的点双的最小权值, 这样子只需要对于圆方树树链剖分之后维护链的最小值就行了. 好的,回归带修改,无非是要动态的维护一下方点的最小权值了. 你问我怎么动态维护若干个值的最小值?搞个\(multiset\)不就好了吗? 但是,现在问题又来了,如果每次修改一个点的权值(这个点当…
CF487E Tourists(圆方树+树链剖分+multiset/可删堆) Luogu 给出一个带点权的无向图,两种操作: 1.修改某点点权. 2.询问x到y之间简单路径能走过的点的最小点权. 题解时间 总感觉是将一堆水题拼出来的丑陋产物(划去) 毫无疑问看题直接搞上圆方树. 用可删堆或者multiset维护方点的权值. 查询直接树剖搞. 但这样会发现修改时间复杂度无法保证. 所以改成每个方点只记录子节点的权值. 当lca为方点时答案计算一下它上面的圆点. $ O(nlog^{2}n) $ #…
题目链接 CF487E 题解 圆方树 + 树剖 裸题 建好圆方树维护路径上最小值即可 方点的值为其儿子的最小值,这个用堆维护 为什么只维护儿子?因为这样修改点的时候就只需要修改其父亲的堆 这样充分利用了一对一的特性优化了复杂度 如此询问时如果\(lca\)为方点,再询问一下\(lca\)的父亲即可 复杂度\(O(qlog^2n)\) #include<algorithm> #include<iostream> #include<cstring> #include<…
目录 圆方树的定义 圆方树的构造 实现 细节 圆方树的运用 「BZOJ 3331」压力 「洛谷 P4320」道路相遇 「APIO 2018」「洛谷 P4630」铁人两项 「CF 487E」Tourists 「SDOI 2018」「洛谷 P4606」战略游戏 「BZOJ 4316」小C的独立集 「洛谷 P5236」「模板」静态仙人掌 「HNOI 2009」「洛谷 P4410」无归岛 圆方树的定义   圆方树是由一个无向图转化出的树形结构.转化方法为: 所有原图的点为"圆点". 对于每个点…
传送门 注意到我们需要求的是两点之间所有简单路径中最小值的最小值,那么对于一个点双联通分量来说,如果要经过它,则一定会经过这个点双联通分量里权值最小的点 注意:这里不能缩边双联通分量,样例\(2\)就是一个反例 上面这个图如果缩点双会缩成\(3\)个,但是缩边双会将整个图缩成\(1\)个点. 假如我们询问的是\((1,4)\)之间的简单路径,而图中权值最小的点为\(7\)号点,那么如果缩成了边双联通分量,你的答案会是\(7\)号点的权值,意即认为可以走到\(7\)号点,但实际上如果到\(7\)号…
仙人掌 圆方树是用来解决仙人掌图的问题的,那什么是仙人掌图呢? 如图,不存在边同时属于多个环的无向连通图是一棵仙人掌 圆方树 定义 原先的仙人掌图,通过一些奇妙的方法,可以转化为一棵由圆点,方点和树边构成的树--圆方树,具体构建方法如下 原仙人掌的每一个点为圆点,对于每个环都新建一个方点,方点向环上的每一个圆点连边,就构成了圆方树. ___ 构建方法 用\(tarjan\)算法求出点双,对于每一个点双新建一个方点与环上的点相连,注意一条边连接两个点的不算点双. 代码: void tarjan(i…
圆方树不仅能解决仙人掌问题(虽然我仙人掌问题也没用过圆方树都是瞎搞过去的),还可以解决一般图的问题 一般图问题在于缩完环不是一棵树,所以就缩点双(包括双向边) 每个方点存他所在点双内除根以外的点的最小权值,这样的好处是更新原点的时候不用更新它一圈的方点,只更新父亲即可 树剖维护,然后查的时候如果lca是方点,就额外查一下他的父亲 #include<iostream> #include<cstdio> #include<vector> #include<cstrin…