题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2125 仙人掌!模仿 lyd 的代码写的,也算是努力理解了: 主要分成 lca 在环上和不在环上,先缩环(环上的点直接连向最高点),那么不在环上的 lca 就跟在树上一样求法: 在环上的话就先求出环外部分,再计算环内距离: 所以一遍 spfa 求从根出发的最短路,再一遍 dfs 求 dfs 序的 dis ,用来处理环上距离,然后 bfs 计算深度用来倍增求 lca,然后分类求答案即可: 注意…
题目 给一个N个点M条边的连通无向图,满足每条边最多属于一个环,有Q组询问,每次询问两点之间的最短路径. 输入格式 输入的第一行包含三个整数,分别表示N和M和Q 下接M行,每行三个整数v,u,w表示一条无向边v-u,长度为w 最后Q行,每行两个整数v,u表示一组询问 输出格式 输出Q行,每行一个整数表示询问的答案 输入样例 9 10 2 1 2 1 1 4 1 3 4 1 2 3 1 3 7 1 7 8 2 7 9 2 1 5 3 1 6 4 5 6 1 1 9 5 7 输出样例 5 6 提示…
题意:仙人掌图最短路. 算法:圆方树DP,$O(n\log n+Q\log n)$ 首先建出仙人掌圆方树(与点双圆方树的区别在于直接连割边,也就是存在圆圆边),然后考虑点u-v的最短路径,显然就是:在圆方树上u-v的路径上的所有边权之和,加上每个环(方点)中连出去的两个点的最短距离. 现在问题就是:如何求出环上两个点的最短路径.考虑这样设定边权,首先显然圆圆边的边权就是原图的边权,然后设一个环在搜索树中深度最小的点为这个环的根,则方圆边的边权是环的根到这个点的最短距离,这个可以在Tarjan的时…
Description 给一个N个点M条边的连通无向图,满足每条边最多属于一个环,有Q组询问,每次询问两点之间的最短路径. Input 输入的第一行包含三个整数,分别表示N和M和Q 下接M行,每行三个整数v,u,w表示一条无向边v-u,长度为w 最后Q行,每行两个整数v,u表示一组询问 Output 输出Q行,每行一个整数表示询问的答案 Sample Input 9 10 2 1 2 1 1 4 1 3 4 1 2 3 1 3 7 1 7 8 2 7 9 2 1 5 3 1 6 4 5 6 1…
传送门 对仙人掌建立圆方树,然后对边定权 对于圆点和圆点之间的边,是原来仙人掌上的桥,边权保持不变 对于圆点和方点之间的边,将圆方树看做以一个圆点为根的有根树之后,一个方点的父亲一定是一个圆点.对于这条方圆边,将边权设为\(0\). 而对于这个方点连接的其他圆点来说,如果要从这个点走到方点的父亲并走出这一个环,在原仙人掌上会走最短的路径.那么这些圆方边的权值就是在原仙人掌上从这个圆点到对应方点的父亲的最短路径长度. 然后在圆方树上建立倍增数组 接着考虑每一个询问. 对于某一个询问\((x,y)\…
题目链接 多次询问求仙人掌上两点间的最短路径. 如果是在树上,那么求LCA就可以了. 先做着,看看能不能把它弄成树. 把仙人掌看作一个图(实际上就是),求一遍根节点到每个点的最短路dis[i]. 对于u,v,若w=LCA(u,v)不在环上(u,v不同在一个环),那么dis(u,v)可以像在树上一样直接求得. 若w=u||w=v,(且w不是环内的一个点),dis(u,v)=dis[u/v]-dis[w]. 如果w在环上,那么设x,y为u,v往上距离最近的环上的离u,v最近的两个点,那么dis(u,…
传送门 人生的第一道仙人掌. 这道题求是仙人掌上的最短路. 先建出圆方树,然后用倍增跑最短路,当lca" role="presentation" style="position: relative;">lcalca是圆点和方点时分类讨论答案即可. 代码如下: #include<bits/stdc++.h> #define N 20005 using namespace std; inline int read(){ int ans=0;…
题意 给定仙人掌,多次询问两点之间的最短路径. \(n\le 10000, Q\le 10000​\) 分析 建出圆方树,分路径 lca 是圆点还是方点讨论. 预处理出根圆点到每个圆点的最短距离 \(dis\) . 如果 lca 是圆点,那么最短距离就是 \(dis_a+dis_b-2*dis_{lca}\). 否则找到 lca 到 a, b 路径上的第一个方点 x, y,最短距离即 \(dis_a-dis_x+dis_b-dis_y+dist(x, y)\) .其中 \(dist(x, y)\…
处理仙人掌 ---> 首先建立出圆方树.则如果询问的两点 \(lca\) 为圆点,直接计算即可, 若 \(lca\) 为方点,则需要额外判断是走环的哪一侧(此时与两个点在环上的相对位置有关.) #include <bits/stdc++.h> using namespace std; #define maxn 200000 #define int long long #define CNST 20 int n, m, Q, gra[maxn][CNST]; int N, dfn[maxn…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2125 因为看了TJ又抄了标程,现在感觉还是轻飘飘的……必须再做一遍. 两点间的情况: 1.直到 lca 都没有在一个环上的部分: 2.本来就处在一个环上: 3.本来不在一个环上,快到 lca 的时候开始处在一个环上了. 第一种情况就普通弄就行.处理倍增 lca 数组和根到每个点的最短路dis值. 第二种情况在环上两部分取较短的就行. 第三种情况是前两种的结合.需要找到 p 和 q 刚开始在…
完结撒花!!!!!!!!!!! 最后一题填坑1A仙人掌WWWWWWW我真流弊 首先把环拆开,环中每一个点连向环的根,然后搞LCA,答案就是套路的d[x]+d[y]-d[lca]*2 然后就可以发现,其实只有当fx和fy在同一个环里面,才有可能通过不同的路线导致答案更小,特判之即可. #include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algor…
题目链接 圆方树.做题思路不写了.. 就是当LCA是方点时跳进那个环可以分类讨论一下用树剖而不必须用倍增: 如果v是u的(唯一的那个)重儿子,那么u的DFS序上+1的点即是要找的:否则v会引出一条新的链. 不用圆方树的做法(代码错了不想改了,但是能A). //3876kb 148ms(Rank6!) #include <cstdio> #include <cctype> #include <algorithm> //#define gc() getchar() #def…
orzYCB 虚树 %自为风月马前卒巨佬% 用于优化一类树形DP问题. 当状态转移只和树中的某些关键点有关的时候,我们把这些点和它们两两之间的LCA弄出来,以点的祖孙关系连成一棵新的树,这就是虚树. 容易证明,如果关键点数量为\(m\),则虚树点数不超过\(2m\). 虚树的构建 dfs原树,对点进行dfn标号,并将关键点按dfn从小到大排序. 搞个栈,栈内的点满足:都在从栈顶的点到原树的根的一条链上. 现在我们准备加入一个点\(x\) 直接加可能破坏一条链的性质,于是把栈顶的元素弹掉直到可以加…
仙人掌 && 圆方树 && 虚树 总结 Part1 仙人掌 定义 仙人掌是满足以下两个限制的图: 图完全联通. 不存在一条边处在两个环中. 其中第二个限制让仙人掌的题做起来十分舒服. 仙人掌的基环DP 首先勾出一棵有根生成树. 那么树边上正常转移即可. 我们把返祖边形成的环归到环上深度最浅的点上,即环顶. 那么到环顶时,单独跑一遍关于环的\(DP\)即可. 一般写法为: void dfs(RG int u,RG int From) { dfn[u] = low[u] = +…
仙人掌&圆方树 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]…
Preface 菜鸡HL终于狗来了他的省选停课,这次的时间很长,暂定停到一试结束,不过有机会二试的话还是可以搞到4月了 这段时间的学习就变得量大而且杂了,一般以刷薄弱的知识点和补一些新的奇怪技巧为主. 偶尔也会打一些比赛找找手感(比如HHHOJ的比赛,Luogu比赛,以及comet OJ上之前的CCPC题) CF和CC看情况,主要是我真的不太喜欢读英文题的恐怖感觉233 希望这段时间的努力可以让我不跪省选吧 2-26 早上晨跑完了就和杨浩讲了停课的事,不出意外地很轻松就通过了. 然后回班拿了点东…
JZOJ8月15日提高组反思--2020年暑假终结篇 T1 仙人掌最短路 抱歉我只会最短路 仙人掌是啥? 听说是缩点+\(LCA\) 最短路30 T2 直接暴力计算 正解\(DP\) \(amazing\) T3 部分分给的满满当当的 然后本蒟蒻就只会10% \(n^8\) 出题人都对我没办法 T4 \(NOI\)难度 题目都看蒙了 \(NOI\)难度为什么要放在提高组?! 虽然是10年前的NOI 反思 暴力打好 多想\(DP\) 集训感言 最后一天了 这一个月左右 打了上万\(byte\)了吧…
[BZOJ2125]最短路(仙人掌,圆方树) 题面 BZOJ 求仙人掌上两点间的最短路 题解 终于要构建圆方树啦 首先构建出圆方树,因为是仙人掌,和一般图可以稍微的不一样 直接\(tarjan\)缩点,对于每一个强连通分量构建方点(只有一个点的就不要建了) 圆方边的权值定义为到\(dfs\)(\(Tarjan\)不就是搞了一棵\(dfs\)树出来吗?)树上深度最小的点的最短距离. 为什么会有最短距离?因为它是一个环啊,走两侧的距离是不同的. 将圆方树树链剖分,和普通的求距离一样,先求解\(LCA…
[题意]给定带边权仙人掌图,Q次询问两点间最短距离.n,m,Q<=10000 [算法]圆方树处理仙人掌问题 [题解]树上的两点间最短路问题,常用倍增求LCA解决,考虑扩展到仙人掌图. 先对仙人掌图建圆方树,圆圆边和原图边权一致.对于每个方点代表的环,记深度最小的点为x,则圆方边的边权是圆点到x的最短距离. 若lca(u,v)为圆点,则两点间最短路转化为圆方树上dis[u]+dis[v]-2*dis[lca].(向上延伸的路径,经过环则必然经过每个方点的x,计算无误) 若lca(u,v)为方点,则…
%%% http://immortalco.blog.uoj.ac/blog/1955 一个通用的写法是建树,对每个环建一个新点,去掉环上的边,原先环上每个点到新点连边,边权为点到环根的最短/长路长度 1023 求仙人掌直径 树形dp,维护每个点向下的最长和次长路径长度,对原有的点直接更新答案,对新点可以把对应环上的点取出,倍长,破环成链,并用单调队列正反各扫一次 #include<cstdio> ],*ptr=buf-; int _(){ ,c=*++ptr; )c=*++ptr; )x=x…
题意:给一个N个点M条边的连通无向图,满足每条边最多属于一个环,有Q组询问,每次询问两点之间的最短路径. 对于80%的数据环的个数<=1 对于100%的数据N<=10000,Q<=10000 思路:bzoj原题 只会80,正解听说是仙人掌 对于80每个询问的最优解必定是一棵树或一棵树+一条边,因为环的个数<=1 倍增LCA求距离,枚举树上加哪条边即可 ..,..]of longint; head,vet,next,fa,dep,a,b,c,len:..]of longint; n,…
description 给一个N个点M条边的连通无向图,满足每条边最多属于一个环,有Q组询问,每次询问两点之间的最短路径. analysis 建出圆方树后,可以知道仙人掌上每一个方点连着的边双其实就是一个简单环 \(tarjan\)缩环的时候可以先弄出每个环的边权和并做一个前缀和,这样环中两点距离就可求 设\(dis[i]\)表示从根节点到\(i\)节点的最小值,若\(x,y\)两点\(LCA\)是原点,则可以直接求 若为方点则表示\(x,y\)距离\(LCA\)最近的祖先是环上不相邻两点,只需…
仙人掌&圆方树学习笔记 1.仙人掌 圆方树用来干啥? --处理仙人掌的问题. 仙人掌是啥? (图片来自于\(BZOJ1023\)) --也就是任意一条边只会出现在一个环里面. 当然,如果你的图片想看起来舒服一点,也可以把图片变成这样子 (图片来源于网络) 2.DFS树 为啥要写这个?--因为这个看起来也可以解决一些仙人掌的问题. 对于一个仙人掌,我们随便构建出一棵生成树. 然后我们就多了一些边--可以叫返祖边,非树边--你想叫啥就叫啥. 因为每条边只会出现在一个环中, 所以每一条返祖边覆盖了树中…
仙人掌上的最短路,这里有详细的题解http://pan.baidu.com/s/1wzCpC我觉得讲的很清楚,不懂的见代码注释吧 type node=record po,next,num:longint; end; ..] of node; dfn,low,p,q,mark,s,d,dis,dep,fa:..] of longint; anc:..,..] of longint; v:..] of boolean; st:..] of longint; t,h,i,len,x,y,z,n,m,t…
Description 为了随时与rainbow快速交流,Freda制造了两部传呼机.Freda和rainbow所在的地方有N座房屋.M条双向光缆.每条光缆连接两座房屋,传呼机发出的信号只能沿着光缆传递,并且传呼机的信号从光缆的其中一端传递到另一端需要花费t单位时间.现在Freda要进行Q次试验,每次选取两座房屋,并想知道传呼机的信号在这两座房屋之间传递至少需要多长时间.Freda和rainbow简直弱爆了有木有T_T,请你帮帮他们吧……N座房屋通过光缆一定是连通的,并且这M条光缆有以下三类连接…
传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=620 绝世难题(一) 可爱的仙人掌 难度级别:E: 运行时间限制:1000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 ---“神犇是怎么样的...” ---“神犇就是这种**题拿过来半小时随便A...(๑•̀ㅂ•́)و✧” 绝世难题之可爱的仙人掌 -------------------------我是题目和吐槽的分割线--------…
题目大意:求从(0,5)到(10,5)的最短距离,起点与终点之间有n堵墙,每个墙有2个门. 题目思路:判断两点间是否有墙(判断两点的连线是否与某一堵墙的线段相交),建立一个图,然后最短路求出就可以了. #include<cstdio> #include<cstdlib> #include<cmath> #include<iostream> #include<algorithm> #include<cstring> #include&l…
Description You have just moved from a quiet Waterloo neighbourhood to a big, noisy city. Instead of getting to ride your bike to school every day, you now get to walk and take the subway. Because you don't want to be late for class, you want to know…
题意: 给定一个仙人掌,边权为1 距离定义为两个点之间的最短路径 直径定义为距离最远的两个点的距离 求仙人掌直径 题解: 类比树形dp求直径. f[i]表示i向下最多多长 处理链的话,直接dp即可. 处理环的话,类似点双tarjan,把环上的点都拉出来. 先考虑拼接更新答案.断环成链复制一倍,为了保证最短路,答案必须只能是f[i]+f[j]+i-j (i-len/2<=j<i) 单调队列优化. 直接i-j即可,另一半的绕环会在复制后的那里处理. 然后更新f[x],直接找环上其他的元素,距离就是…
[BZOJ1023]仙人掌图(仙人掌,动态规划) 题面 BZOJ 求仙人掌的直径(两点之间最短路径最大值) 题解 一开始看错题了,以为是求仙人掌中的最长路径... 后来发现看错题了一下就改过来了.. 首先和普通的仙人掌\(dp\)是一样的, 对于没有问题的圆圆边,直接做最长链的转移(同时更新\(ans\)) 然后对于一个环,把它拎出来单独考虑 首先要对于这个环,计算能够贡献的答案, 然后再用环上的值更新环的最顶点 先考虑怎么更新,这个直接拿环上的点的\(dp\)值,再计算一下这两点之间的最短路(…