圆方树 useful things】的更多相关文章

我写这篇博客的原因 证明我也是学过圆方树的 顺便存存代码 前置技能 双联通分量:点双 然后就没辣 圆方树 建立 新建一个图 定义原图中的所有点为圆点 对于每个点双联通分量(只有两个点的也算) 建立一个方点,向所有的点双内的点连边 性质 一定是个森林 每个点双有唯一的方点 圆点方点相间分布,相同点不相邻 等等 例子 1 题面 求可以出现在两点之间的简单路路径上的点的最大权值,不带修改 分析 考虑用圆方树来解决 设圆点权值为本身,方点权值为点双中的最大权值 那么就是树上的路径最大权值 例子 2 还是…
一道很好的圆方树入门题 感谢PinkRabbit巨佬的博客,讲的太好啦 首先是构建圆方树的代码,也比较好想好记 void tarjan(int u) { dfn[u] = low[u] = ++dfn_clk; //初始化dfn和low数组 stk[++tp] = u; //把u加入栈中 for(int i = head[u]; i; i = e[i].next) { int v = e[i].to; if(!dfn[v]) { //v还未访问 tarjan(v); //先访问 low[u] =…
仙人掌&圆方树学习笔记 1.仙人掌 圆方树用来干啥? --处理仙人掌的问题. 仙人掌是啥? (图片来自于\(BZOJ1023\)) --也就是任意一条边只会出现在一个环里面. 当然,如果你的图片想看起来舒服一点,也可以把图片变成这样子 (图片来源于网络) 2.DFS树 为啥要写这个?--因为这个看起来也可以解决一些仙人掌的问题. 对于一个仙人掌,我们随便构建出一棵生成树. 然后我们就多了一些边--可以叫返祖边,非树边--你想叫啥就叫啥. 因为每条边只会出现在一个环中, 所以每一条返祖边覆盖了树中…
传送门 题意简述:给你一张无向图,问你满足存在从a−>b−>ca->b->ca−>b−>c且不经过重复节点的路径的有序点对(a,b,c)(a,b,c)(a,b,c)的数量. 思路: 对每一个连通块建一棵圆方树,然后可以按照圆点和方点做不同的树形dpdpdp. 圆点:找存在于两棵不同子树的点对数 方点:找存在于三颗不同子树的点对数. 代码: #include<bits/stdc++.h> #define ri register int using namesp…
orzYCB 虚树 %自为风月马前卒巨佬% 用于优化一类树形DP问题. 当状态转移只和树中的某些关键点有关的时候,我们把这些点和它们两两之间的LCA弄出来,以点的祖孙关系连成一棵新的树,这就是虚树. 容易证明,如果关键点数量为\(m\),则虚树点数不超过\(2m\). 虚树的构建 dfs原树,对点进行dfn标号,并将关键点按dfn从小到大排序. 搞个栈,栈内的点满足:都在从栈顶的点到原树的根的一条链上. 现在我们准备加入一个点\(x\) 直接加可能破坏一条链的性质,于是把栈顶的元素弹掉直到可以加…
[BZOJ2125]最短路(仙人掌,圆方树) 题面 BZOJ 求仙人掌上两点间的最短路 题解 终于要构建圆方树啦 首先构建出圆方树,因为是仙人掌,和一般图可以稍微的不一样 直接\(tarjan\)缩点,对于每一个强连通分量构建方点(只有一个点的就不要建了) 圆方边的权值定义为到\(dfs\)(\(Tarjan\)不就是搞了一棵\(dfs\)树出来吗?)树上深度最小的点的最短距离. 为什么会有最短距离?因为它是一个环啊,走两侧的距离是不同的. 将圆方树树链剖分,和普通的求距离一样,先求解\(LCA…
[CF487E]Tourists(圆方树) 题面 UOJ 题解 首先我们不考虑修改,再来想想这道题目. 我们既然要求的是最小值,那么,在经过一个点双的时候,走的一定是具有较小权值的那一侧. 所以说,我们可以让所有的方点表示它所在的点双的最小权值, 这样子只需要对于圆方树树链剖分之后维护链的最小值就行了. 好的,回归带修改,无非是要动态的维护一下方点的最小权值了. 你问我怎么动态维护若干个值的最小值?搞个\(multiset\)不就好了吗? 但是,现在问题又来了,如果每次修改一个点的权值(这个点当…
[APIO2018]铁人两项(圆方树,动态规划) 题面 UOJ 洛谷 BZOJ 题解 嘤嘤嘤,APIO的时候把一个组合数写成阶乘了,然后这题的70多分没拿到 首先一棵树是很容易做的,随意指定起点终点就只能在两点路径上选择第三点.那么考虑过中点的路径个数,就可以很方便的\(dp\)计算了. 对于仙人掌而言,把环全部缩成点,转成树,缩起来的点额外定义一个点权,同样可以直接在树上做\(dp\),额外考虑环自身内部的贡献. 那么对于一般图而言,构建圆方树,那么选定起点和终点后,还是只能选择两点路径之间的…
题目链接 圆方树 圆方树就是对于联通无向图中的每一个点双新建一个方点,与点双中的每个点连一条边,然后将原来的边删去.将原来的点看作圆点,新建的点看作方点.所以叫做圆方树. 性质 1.圆方树肯定是棵树(废话).证明显然. 2.圆方树中与圆点相连的点肯定是方点.与方点相连的点肯定是圆点. 算法 根据圆方树的定义就可以知道.构建圆方树的过程实际上就是找点双的过程.本质上就是找割点.所以用tarjan来做就好了.将找出的点双中的点与新建的点连边即可. 思路 这个题就是圆方树的经典应用,先对于原图构建出圆…
[NOI2013模拟]坑带的树 题意: 求\(n\)个点,\(m\)条边的同构仙人球个数. \(n\le 1000\) 这是一道怎么看怎么不可做的题. 这种题,肯定是圆方树啦~ 好,那么首先转为广义圆方树. 圆方树上有两种点(废话),那么对于一个方点,它实际上代表的是一个点双,所以我们需要判断一个方点的子树是否中间对称,如果对称则这个子树答案乘\(2\). 显然. 然后判断一个圆点与几个方点相连时,注意到方点之间是可以互相交换顺序的,于是我们看看有多少个子树相同,乘个阶乘. 最后就是求同构仙人球…