[BZOJ2125]最短路(圆方树DP)】的更多相关文章

题意:仙人掌图最短路. 算法:圆方树DP,$O(n\log n+Q\log n)$ 首先建出仙人掌圆方树(与点双圆方树的区别在于直接连割边,也就是存在圆圆边),然后考虑点u-v的最短路径,显然就是:在圆方树上u-v的路径上的所有边权之和,加上每个环(方点)中连出去的两个点的最短距离. 现在问题就是:如何求出环上两个点的最短路径.考虑这样设定边权,首先显然圆圆边的边权就是原图的边权,然后设一个环在搜索树中深度最小的点为这个环的根,则方圆边的边权是环的根到这个点的最短距离,这个可以在Tarjan的时…
传送门 对仙人掌建立圆方树,然后对边定权 对于圆点和圆点之间的边,是原来仙人掌上的桥,边权保持不变 对于圆点和方点之间的边,将圆方树看做以一个圆点为根的有根树之后,一个方点的父亲一定是一个圆点.对于这条方圆边,将边权设为\(0\). 而对于这个方点连接的其他圆点来说,如果要从这个点走到方点的父亲并走出这一个环,在原仙人掌上会走最短的路径.那么这些圆方边的权值就是在原仙人掌上从这个圆点到对应方点的父亲的最短路径长度. 然后在圆方树上建立倍增数组 接着考虑每一个询问. 对于某一个询问\((x,y)\…
题意 给定仙人掌,多次询问两点之间的最短路径. \(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)\…
Description 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人掌图(cactus). 所谓简单回路就是指在图上不重复经过任何一个顶点的回路. 举例来说,上面的第一个例子是一张仙人图,而第二个不是——注意到它有三条简单回路: (4,3,2,1,6,5,4).(7,8,9,10,2,3,7)以及(4,3,7,8,9,10,2,1,6,5,4), 而(2,3)同时出现在前两个的简单回路里.另外,第三张图也不是仙人图,因为它并不是连通图…
[题意]给定带边权仙人掌图,Q次询问两点间最短距离.n,m,Q<=10000 [算法]圆方树处理仙人掌问题 [题解]树上的两点间最短路问题,常用倍增求LCA解决,考虑扩展到仙人掌图. 先对仙人掌图建圆方树,圆圆边和原图边权一致.对于每个方点代表的环,记深度最小的点为x,则圆方边的边权是圆点到x的最短距离. 若lca(u,v)为圆点,则两点间最短路转化为圆方树上dis[u]+dis[v]-2*dis[lca].(向上延伸的路径,经过环则必然经过每个方点的x,计算无误) 若lca(u,v)为方点,则…
题意:求仙人掌图直径. 算法:建出仙人掌圆方树,对于圆点直接做普通的树上DP(忽略方点儿子),方点做环上DP并将值直接赋给父亲. 建图时有一个很好的性质,就是一个方点在邻接表里的点的顺序正好就是从环的根开始的整个环的点的顺序,所以可以直接DP. #include<cstdio> #include<algorithm> #define rep(i,l,r) for (int i=l; i<=r; i++) using namespace std; ,inf=; int n,m,…
题意:给出一张图,求满足存在一条从u到v的长度大于3的简单路径的有序点对(u,v)个数. 做了上一题[HDU5739]Fantasia(点双连通分量+DP),这个题就是一个NOIP题了. 一开始考虑了各种各样的情况,最后发现几乎没有什么特殊情况,程序很优美. 首先和上一题一样建出圆方树,然后如果选择了点对(a,c),那么b一定在树上a到c的路径上. 给树上每个BCC点权为这个BCC的大小,普通点点权设为-1,那么答案就是所有起点终点均为普通点的路径的权值和.直接树形DP即可. #include<…
题意:给一张无向点带有权无向图.定义连通图的权值为图中各点权的乘积,图的权值为其包含的各连通图的权和.设z_i为删除i点后图的权值,求$S = (\sum\limits_{i=1}^{n}i\cdot z_i) \text{ mod } (10^9 + 7)$. 显然和点双有关.回忆各种tarjan:缩SCC得DAG,缩边BCC得一棵树,我们要想办法把点BCC也缩成一棵树. tarjan求点双,然后给每个点双新建一个点,将这个BCC内的所有点连向这个点. 因为点与点之间没有边,SCC与SCC之间…
QWQ神仙题啊(据说是今年第一次出现圆方树的地方) 首先根据题目,我们就是求对于每一个路径\((s,t)\)他的贡献就是两个点之间的点数,但是图上问题我并没有办法很好的解决... 这时候考虑圆方树,我们将圆方树建出来之后, 我们令方点的权值是他所连接的圆点之和,圆点的权值是\(-1\). 这里之所以让圆点的贡献是-1,是为了方便表示路径的贡献(不然貌似比较复杂). 如果我们这么赋值的话,那么一个条路经的贡献就应该是点权之和. QWQ可惜枚举两个端点是\(O(n^2)\)复杂度的 那么这时候,我们…
仙人掌&圆方树学习笔记 1.仙人掌 圆方树用来干啥? --处理仙人掌的问题. 仙人掌是啥? (图片来自于\(BZOJ1023\)) --也就是任意一条边只会出现在一个环里面. 当然,如果你的图片想看起来舒服一点,也可以把图片变成这样子 (图片来源于网络) 2.DFS树 为啥要写这个?--因为这个看起来也可以解决一些仙人掌的问题. 对于一个仙人掌,我们随便构建出一棵生成树. 然后我们就多了一些边--可以叫返祖边,非树边--你想叫啥就叫啥. 因为每条边只会出现在一个环中, 所以每一条返祖边覆盖了树中…