首页 > 其他分享 >圆方树

圆方树

时间:2024-03-29 17:22:05浏览次数:14  
标签:一个点 圆点 路径 方点 圆方树 权值

圆方树

这里的圆方树指广义圆方树。

对于一张 \(n\) 个点的无向图,其中包含 \(k\) 个点双,那么这张图建出的圆方树一共有 \(n+k\) 个点,其中前 \(n\) 个点为原图中的点,称为圆点,后 \(k\) 个点每个点代表一个点双,称为方点,每个点双与其中包含的点连边构成一个菊花,这 \(k\) 个菊花经由图中的割点连在一起。

圆方树的一些性质:

  • 任取树上的一条链,其中圆点与方点交替出现。
  • 两个圆点 \(u,v\) 在原图中简单路径的并等价于圆方树上 \(u,v\) 间的路径,且该路径上除 \(u,v\) 的圆点为 \(u,v\) 间路径的必经点。
  • 顺带一提,除了两个点由一条边相连的情况,一个点双一定是一个边双。

在圆方树中,我们经常通过给每个点赋上恰当点权的方式解决问题。

例题:

铁人两项

枚举起点和终点,那么问题变为求这两点间简单路径点集的并,这等价于求圆方树上两点间间路径代表的点的并。

建立圆方树,给圆点赋 \(-1\) 的权,方点赋其代表的点双大小的权,那么点对 \(u,v\) 的答案就是圆方树上 \(u,v\) 路径的权值和。

Proof:首先我们记录了路径上所有点双大小的和,但这样会算重,因为两个点双间由同一个割点相连,给圆点赋值为 \(-1\) 恰好消掉了多算的一次。

然后换一种统计方式,树形 dp 求经过点 \(x\) 的路径条数在乘上这个点的权即可,注意图可能不连通。

Tourists

这题 *3200

要求所有简单路径上的最小值,那么我们可以建立圆方树,圆点的权值为它自己,方点的权值为与它相连的圆点的权值的最小值,树剖加线段树维护即可。

但是这样做一个圆点的修改会影响到若干个方点,所以我们将方点的权值改为它所有子节点的权值的最小值,这样修改时只需要改父亲即可。

注意这样做如果两点间 LCA 为方点的话还要算上它的父亲。

为了方便的修改权值,我们可以对每个点开一个 multiset,得以快速维护。

战略游戏

首先答案为点集中任取两点组成的点对间路径上圆点的并集大小,这个由圆方树的性质可以直接得到,所以设圆点的权值为 \(1\),方点的权值为 \(0\),求树上两点间权值和即可,但不应考虑两个端点。

但是这样做复杂度过高,考虑优化,类似于蓝书上异象石一题,将答案转化为包含集合中所有点的最小联通块,最终再减去集合的大小即可。

因此我们将这些点按照在树上的时间戳排序,然后依次统计相邻两点间的路径权值和,这里我们认为第一个点与最后一个点也相邻,这样一个点会算上两次,最后除 \(2\) 即可,但是这样不能统计第一个点与最后一个点的 LCA,最后要判一下。

Edge Queries

题目中的性质没有用,将题目中的简单路径转化为圆方树上两点间的路径,然后圆点权值为 \(0\),方点的权值为它代表的点双内部的边数,因为一个点双中删一条边并不影响连通性。但要特判只有一条边的情况,此时不能删边。

如何统计点双中边的数量呢?我们可以对一个点双中的点先打上标记,然后枚举以这个点双中的点为起点的边,如果其终点也在这个点双中,那么经过这个点双的边数加一。但因为是无向图,所以最后的边数要除二。

标签:一个点,圆点,路径,方点,圆方树,权值
From: https://www.cnblogs.com/aCssen/p/18104267

相关文章

  • 圆方树学习笔记
    圆方树学习笔记圆方树是优秀的图论算法,从仙人掌图向无向图扩展,利用割点和点双联通分量的性质,实现了图向树的转换。对仙人掌的处理:圆方树——处理仙人掌的利器而且实现十分简单算法思路前置知识割点和桥,点双联通分量。思路对于一个无向图,圆方树理解可以如下:原图中点是圆......
  • 圆方树学习笔记
    今天在做ABC318G这道题,要用到圆方树的知识,于是就去学了圆方树。学习圆方树首先需要学习点双连通分量以及缩点,此处不多赘述。圆方树中分两种类型的点:圆点和方点。圆点指的是原来的无向图中的所有点,而方点指的是每一个点双连通分量所代表的点。相当于每一个点双连通分量就是一个......
  • 圆方树 useful things
    圆方树,是解决仙人掌问题的实用方法,假设最初图都是圆点,对于每个环新建一个方点并连接这个环上所有圆点,能很好规避同一个点可能属于很多个环的情况,并且发现build完之后是一棵树广义圆方树,能够不局限于去解决仙人掌问题,能上升到无向图层面,很好解决图上路径类,等等问题那么如何建立圆......
  • 圆方树 useful things
    圆方树,是解决仙人掌问题的实用方法,假设最初图都是圆点,对于每个环新建一个方点并连接这个环上所有圆点,能很好规避同一个点可能属于很多个环的情况,并且发现build完之后是一棵树广义圆方树,能够不局限于去解决仙人掌问题,能上升到无向图层面,很好解决图上路径类,等等问题那么如何建立圆......
  • 圆方树
    圆方树的引入我们知道,图没有很好的性质,而树有很多性质,并且容易通过很多方式来维护树上信息,因此将图上问题转化为树上问题是我们想要解决的。圆方树就是将图转化为树的数据结构。圆方树的分类圆方树分为两类:狭义圆方树,广义圆方树。狭义圆方树狭义圆方树是可以用来将仙人掌图转......
  • 圆方树
    为什么只写圆方树呢,因为点双代码比圆方树长一倍其实是因为边双可以被圆方树表示出来前言这里给tarjan中的low数组的定义明确一下,其代表的是包括自己在内的搜索子树内经过最多一条非树边能够到达的最浅节点边双这个很简单,如果有一个点的low值等于他的dfn序了,那它和栈......
  • 「学习笔记」圆方树
    圆方树最初是处理「仙人掌图」(每条边在不超过一个简单环中的无向图)的一种工具,不过发掘它的更多性质,有时我们可以在一般无向图上使用它。个人觉得,圆方树是一个很好的工具。圆方树的题目更多的侧重于想,而不是怎么建圆方树。前置知识——点双连通分量点双连通分量:不存在割点的图。......
  • 圆方树
    构建在将图变为树的方法里,圆方树与v-dcc类似。圆方树中,原来的每个点对应一个圆点,每个点双对应一个方点。故圆方树的节点数为\(n+c\),其中\(n=|V|\),\(c=|\text{v-dcc}|\).对于每个点双,其方点向这个点双里的每个点连边,形成一个菊花图,多个菊花图通过割点连接。割点的数量小......
  • 点双边双强连通拓展(圆方树)以及一些小技巧
    点双边双强连通拓展以及一些小技巧目录点双边双强连通拓展以及一些小技巧小技巧:1.关于割点:2.关于点双和边双的判断技巧:3.关于自己制造样例的技巧:例题:拓展知识1.广义圆方树:知识点:例题:bzoj3331小技巧:1.关于割点:点双常常存在割点情况,很难搞,每次dfs都很头疼(不知道割点在哪几个连通......
  • 圆方树与仙人掌
    圆方树前置知识:点双连通分量tarjan求点双对于一个无向图,在维护某些信息时可以利用圆方树的方法把原图转为一棵树来处理我们称在原图上的点是圆点对于每个点双联通分量,新建一个连向点双内所有点的新点,称其为方点点双内的所有点除了向方点连边以外不向点双内其他点连......