圆方树新技能get.具体笔记见图连通性问题学习笔记. 这题求无向图的必经点,这个是一个固定套路:首先,一张连通的无向图中,每对点双和点双之间是以一个且仅一个割点连接起来的(如果超过一个就不能是割点了),那么,在一个点双内部,从出发点开始,要走到另外一个点双中,这个中间的割点就是一条必经之路(没有其他路可以绕,否则这就有一个环了),所以,路上所有割点都是必经点,而点双内部走的话,由点双的定义,是至少有两条点不相交的路径的(当然两个点的点双的话直接没有中间点),所以中间非割点是可经而不是必经的. 所…
题意 略 题解 求路径上的割点. 然后就直接圆方树上差分 CODE #include <bits/stdc++.h> using namespace std; inline void rd(int &x) { char ch; for(;!isdigit(ch=getchar());); for(x=ch-'0';isdigit(ch=getchar());)x=x*10+ch-'0'; } const int MAXN = 100005; const int MAXM = 20000…
[题解]Uoj#30 Tourist(广义圆方树+树上全家桶) 名字听起来很霸气其实算法很简单.... 仙人掌上的普通圆方树是普及题,但是广义圆方树虽然很直观但是有很多地方值得深思 说一下算法的流程: 对于所有点强连通分量(强联通,意味着要找极大的那个),建立一个虚点\(u\),然后把环内所有边断开,紧接着让环内所有点向这个虚点连边.可以看出对于每一个大小为\(s\)的SCC,我们导出了一个点数为\(s+1\)边数为\(n\)的图且联通,所以圆方树是树. 为了方便讨论,对于每个桥加个虚点.虚点维…
题目链接 圆方树 圆方树就是对于联通无向图中的每一个点双新建一个方点,与点双中的每个点连一条边,然后将原来的边删去.将原来的点看作圆点,新建的点看作方点.所以叫做圆方树. 性质 1.圆方树肯定是棵树(废话).证明显然. 2.圆方树中与圆点相连的点肯定是方点.与方点相连的点肯定是圆点. 算法 根据圆方树的定义就可以知道.构建圆方树的过程实际上就是找点双的过程.本质上就是找割点.所以用tarjan来做就好了.将找出的点双中的点与新建的点连边即可. 思路 这个题就是圆方树的经典应用,先对于原图构建出圆…
题意 如今,路由器和交换机构建起了互联网的骨架.处在互联网的骨干位置的核心路由器典型的要处理100Gbit/s的网络流量. 他们每天都生活在巨大的压力之下.小强建立了一个模型.这世界上有N个网络设备,他们之间有M个双向的链接.这个世界是连通的. 在一段时间里,有Q个数据包要从一个网络设备发送到另一个网络设备.一个网络设备承受的压力有多大呢?很显然,这取决于Q个数据包各自走的路径. 不过,某些数据包无论走什么路径都不可避免的要通过某些网络设备.你要计算:对每个网络设备,必须通过(包括起点.终点)他…
SADPAIRS 删点不连通,点双,圆方树 非割点:没有影响 割点:子树DP一下 有不同颜色,所以建立虚树 在圆方树上dfs时候 如果当前点是割点 1.统计当前颜色虚树上的不连通点对,树形DP即可 2.统计所有颜色的虚树上的不连通点对.... 一个麻烦事是,虚树上一条边上选择一个原树割点,都会对这个虚树造成相同的影响(两边sz乘积) n,m 2e5 树上差分 设虚树上,(x,y)的边,x是y的父亲 原树上,x的位置减去贡献,y的原树father位置加上贡献 最后dfs扫一遍就行了. 实际上麻烦事…
仙人掌 && 圆方树 && 虚树 总结 Part1 仙人掌 定义 仙人掌是满足以下两个限制的图: 图完全联通. 不存在一条边处在两个环中. 其中第二个限制让仙人掌的题做起来十分舒服. 仙人掌的基环DP 首先勾出一棵有根生成树. 那么树边上正常转移即可. 我们把返祖边形成的环归到环上深度最浅的点上,即环顶. 那么到环顶时,单独跑一遍关于环的\(DP\)即可. 一般写法为: void dfs(RG int u,RG int From) { dfn[u] = low[u] = +…
目录 圆方树的定义 圆方树的构造 实现 细节 圆方树的运用 「BZOJ 3331」压力 「洛谷 P4320」道路相遇 「APIO 2018」「洛谷 P4630」铁人两项 「CF 487E」Tourists 「SDOI 2018」「洛谷 P4606」战略游戏 「BZOJ 4316」小C的独立集 「洛谷 P5236」「模板」静态仙人掌 「HNOI 2009」「洛谷 P4410」无归岛 圆方树的定义   圆方树是由一个无向图转化出的树形结构.转化方法为: 所有原图的点为"圆点". 对于每个点…
仙人掌&圆方树 Tags:图论 [x] [luogu4320]道路相遇 https://www.luogu.org/problemnew/show/P4320 [ ] [SDOI2018]战略游戏 https://www.luogu.org/problemnew/show/P4606 [x] [APIO2018]铁人两项 https://www.luogu.org/problemnew/show/P4630 [ ] [SHOI2008]仙人掌图 [ ] [BZOJ4316]小C的独立集 [x]…
我写这篇博客的原因 证明我也是学过圆方树的 顺便存存代码 前置技能 双联通分量:点双 然后就没辣 圆方树 建立 新建一个图 定义原图中的所有点为圆点 对于每个点双联通分量(只有两个点的也算) 建立一个方点,向所有的点双内的点连边 性质 一定是个森林 每个点双有唯一的方点 圆点方点相间分布,相同点不相邻 等等 例子 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树 为啥要写这个?--因为这个看起来也可以解决一些仙人掌的问题. 对于一个仙人掌,我们随便构建出一棵生成树. 然后我们就多了一些边--可以叫返祖边,非树边--你想叫啥就叫啥. 因为每条边只会出现在一个环中, 所以每一条返祖边覆盖了树中…
orzYCB 虚树 %自为风月马前卒巨佬% 用于优化一类树形DP问题. 当状态转移只和树中的某些关键点有关的时候,我们把这些点和它们两两之间的LCA弄出来,以点的祖孙关系连成一棵新的树,这就是虚树. 容易证明,如果关键点数量为\(m\),则虚树点数不超过\(2m\). 虚树的构建 dfs原树,对点进行dfn标号,并将关键点按dfn从小到大排序. 搞个栈,栈内的点满足:都在从栈顶的点到原树的根的一条链上. 现在我们准备加入一个点\(x\) 直接加可能破坏一条链的性质,于是把栈顶的元素弹掉直到可以加…
[BZOJ2125]最短路(仙人掌,圆方树) 题面 BZOJ 求仙人掌上两点间的最短路 题解 终于要构建圆方树啦 首先构建出圆方树,因为是仙人掌,和一般图可以稍微的不一样 直接\(tarjan\)缩点,对于每一个强连通分量构建方点(只有一个点的就不要建了) 圆方边的权值定义为到\(dfs\)(\(Tarjan\)不就是搞了一棵\(dfs\)树出来吗?)树上深度最小的点的最短距离. 为什么会有最短距离?因为它是一个环啊,走两侧的距离是不同的. 将圆方树树链剖分,和普通的求距离一样,先求解\(LCA…
[APIO2018]铁人两项(圆方树,动态规划) 题面 UOJ 洛谷 BZOJ 题解 嘤嘤嘤,APIO的时候把一个组合数写成阶乘了,然后这题的70多分没拿到 首先一棵树是很容易做的,随意指定起点终点就只能在两点路径上选择第三点.那么考虑过中点的路径个数,就可以很方便的\(dp\)计算了. 对于仙人掌而言,把环全部缩成点,转成树,缩起来的点额外定义一个点权,同样可以直接在树上做\(dp\),额外考虑环自身内部的贡献. 那么对于一般图而言,构建圆方树,那么选定起点和终点后,还是只能选择两点路径之间的…
[NOI2013模拟]坑带的树 题意: 求\(n\)个点,\(m\)条边的同构仙人球个数. \(n\le 1000\) 这是一道怎么看怎么不可做的题. 这种题,肯定是圆方树啦~ 好,那么首先转为广义圆方树. 圆方树上有两种点(废话),那么对于一个方点,它实际上代表的是一个点双,所以我们需要判断一个方点的子树是否中间对称,如果对称则这个子树答案乘\(2\). 显然. 然后判断一个圆点与几个方点相连时,注意到方点之间是可以互相交换顺序的,于是我们看看有多少个子树相同,乘个阶乘. 最后就是求同构仙人球…
传送门 又学会了一个新东西好开心呢~ 思路 显然,假如枚举了起始点\(x\)和终止点\(y\),中转点就必须在它们之间的简单路径上. 不知为何想到了圆方树,可以发现,如果把方点的权值记为双联通分量的大小,圆点权值记为-1,那么\(x \rightarrow y\)的答案就是树上\(x\rightarrow y\)的路径权值和. 直接枚举\(O(n^2)\),点分治\(O(n\log n)\),考虑每个点被经过的次数乘上它的权值即可\(O(n)\). 注意图可能不连通. 代码 #include<b…
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ30.html 题目传送门 - UOJ#30 题意 uoj写的很简洁.清晰,这里就不抄一遍了. 题解 首先建出圆方树.接下来,我们称"圆点"为原来有的点,"方点"为新增的点. 然后先只考虑在线询问如何做. ——把方点的值设置成所有与他连边的圆点的权值的最小值,直接在圆方树上树链剖分再套个线段树支持一下区间询问即可. 然后会发现这样做支持不了修改操作. ——直接来个菊花图不断修…
传送门 要求的是一条按顺序经过\(s,t,c\)三个点的简单路径.简单路径的计数问题不难想到点双联通分量,进而使用圆方树进行求解. 首先将原图缩点,对于一个大小为\(size\)的点双联通分量内,在这个分量内部任意选择\(s,t,c\)都是可行的,可以贡献\(P_{size}^3\)的答案. 接下来就需要计算跨越点双联通分量的\(s,t,c\)了.这个可以在圆方树上进行树形DP统计答案. 但是考虑到割点可能会被统计多次,我们令圆方树中所有的方点都不包含它的父亲,这样对于一个圆点就只会被计入一次答…
传送门 注意到我们需要求的是两点之间所有简单路径中最小值的最小值,那么对于一个点双联通分量来说,如果要经过它,则一定会经过这个点双联通分量里权值最小的点 注意:这里不能缩边双联通分量,样例\(2\)就是一个反例 上面这个图如果缩点双会缩成\(3\)个,但是缩边双会将整个图缩成\(1\)个点. 假如我们询问的是\((1,4)\)之间的简单路径,而图中权值最小的点为\(7\)号点,那么如果缩成了边双联通分量,你的答案会是\(7\)号点的权值,意即认为可以走到\(7\)号点,但实际上如果到\(7\)号…
传送门 对仙人掌建立圆方树,然后对边定权 对于圆点和圆点之间的边,是原来仙人掌上的桥,边权保持不变 对于圆点和方点之间的边,将圆方树看做以一个圆点为根的有根树之后,一个方点的父亲一定是一个圆点.对于这条方圆边,将边权设为\(0\). 而对于这个方点连接的其他圆点来说,如果要从这个点走到方点的父亲并走出这一个环,在原仙人掌上会走最短的路径.那么这些圆方边的权值就是在原仙人掌上从这个圆点到对应方点的父亲的最短路径长度. 然后在圆方树上建立倍增数组 接着考虑每一个询问. 对于某一个询问\((x,y)\…
Description ​ 给你一张\(~n~\)个点\(~m~\)条边的无向图,保证无重边无自环, 共\(~q~\)组询问求\(~x~\)到\(~y~\)的路径上必经的点数. Solution ​ 建出圆方树后, 不难发现答案所求就是\(~x~\)到\(~y~\)的路径上的圆点个数, 而圆方树拥有的优秀性质就是相邻点对一圆一方,所以圆点个数就是 树上路径长度的\(~1/2~ + 1~\), 树上路径长度可以简单地由\(~dep_x,~dep_y, ~dep_{lca(x, ~y)}~\)求得.…
Description 省选临近,放飞自我的小Q无心刷题,于是怂恿小C和他一起颓废,玩起了一款战略游戏. 这款战略游戏的地图由n个城市以及m条连接这些城市的双向道路构成,并且从任意一个城市出发总能沿着道路走到任意其他城市. 现在小C已经占领了其中至少两个城市,小Q可以摧毁一个小C没占领的城市,同时摧毁所有连接这个城市的道路. 只要在摧毁这个城市之后能够找到某两个小C占领的城市u和v,使得从u出发沿着道路无论如何都不能走到v,那么小Q就能赢下这一局游戏. 小Q和小C一共进行了q局游戏,每一局游戏会…
[SDOI2018]战略游戏 这题是道路相遇(题解)的升级版,询问的两个点变成了\(S\)个点. LG传送门 还是先建出圆方树,考虑对于询问的\(S\)个点,答案就是圆方树上能包含这些点的最小连通块中的圆点个数减去\(S\).问题变成了怎样求这样的连通块中的圆点个数,直接给结论吧:先搞出树的dfs序,把询问的点按dfs序从小到大排一遍序,每次把答案加上第\(i\)和第\(i + 1\)个点之间的圆点个数,但是不算lca,再加上第\(1\)个和第\(S\)个点之间的圆点个数,然后除以二就得到了这个…
[APIO2018] Duathlon 铁人两项 LG传送门 圆方树+简单DP. 不会圆方树的话可以看看我的另一篇文章. 考虑暴力怎么写,枚举两个点,答案加上两个点之间的点的个数. 看到题面中的一句话: 考虑到安全因素,选择的路径经过同一个点至多一次. 换句话说就是简单路径,用(广义)圆方树的基本条件已经满足,可以把问题变到树上:令方点的权值为所在点双的大小,圆点会被算重所以点权为\(-1\),统计任意两点间的点权和就好了.直接做是\(n ^ 2\)的,考虑枚举每一个点看会产生多少贡献,对答案的…
题目链接 题意大概是,求有多少三元组$(s,c,f)(s \neq c, c \neq f, s \neq f)$,满足从$s$到$f$有一条简单路径经过$c$. 得到结论: 点双中任意互不相同的三个点,必定存在一条简单路径依次经过这三个点. 显然,割点只能经过一次. 建出一棵圆方树,圆点的权值为$-1$,方点的权值为该点双中点的个数,那任意两个圆点之间可以作为它们中转点的个数就是它们在圆方树上路径的点权和. 具体来讲就是割点上只能经过一次,圆点设成$-1$是为了去重方便. 以前只写过点双缩树,…
题目链接 本代码10分(感觉速度还行..). 建圆方树,预处理一些东西.对询问建虚树. 对于虚树上的圆点直接做:对于方点特判,枚举其所有儿子,如果子节点不在该方点代表的环中,跳到那个点并更新其val,加入B数组:对于环中的点直接加入B数组. 然后像BZOJ2125一样更新环上的.懒得写拆环的单调队列了,直接用min(abs,len-abs). UOJ特么的数据有毒啊.调不出来了,AC的代码一个比一个码风奇特,还有的贼长..先不调了. 一上午+半下午了..从注释的代码可以看出调的过程多么鬼畜. /…
题目链接 LOJ 洛谷P4630 先对这张图建圆方树. 对于S->T这条(些)路径,其对答案的贡献为可能经过的所有点数,那么我们把方点权值设为联通分量的大小,可以直接去求树上路径权值和. 因为两方点之间的圆点会计算两次,所以圆点权值设为-1就好了. 那么现在有 \(n^2\) 个点对,求每个点对之间的路径上点的权值和. 对每个点计算一下被计算次数就可以了.这个路径次数计算注意考虑全.. 另外点对是圆点间的,所以方点初始sz[]为0,圆点的sz[]才是1. 方点其实建一条边就可以. LOJ为什么找…
题目链接 洛谷P4606 双倍经验:弱化版 题解 两点之间必经的点就是圆方树上两点之间的圆点 所以只需建出圆方树 每次询问建出虚树,统计一下虚树边上有多少圆点即可 还要讨论一下经不经过根\(1\)的情况 P4606 #include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<map> #define…
[题意]给定带边权仙人掌图,Q次询问两点间最短距离.n,m,Q<=10000 [算法]圆方树处理仙人掌问题 [题解]树上的两点间最短路问题,常用倍增求LCA解决,考虑扩展到仙人掌图. 先对仙人掌图建圆方树,圆圆边和原图边权一致.对于每个方点代表的环,记深度最小的点为x,则圆方边的边权是圆点到x的最短距离. 若lca(u,v)为圆点,则两点间最短路转化为圆方树上dis[u]+dis[v]-2*dis[lca].(向上延伸的路径,经过环则必然经过每个方点的x,计算无误) 若lca(u,v)为方点,则…