传送门 又学会了一个新东西好开心呢~ 思路 显然,假如枚举了起始点\(x\)和终止点\(y\),中转点就必须在它们之间的简单路径上. 不知为何想到了圆方树,可以发现,如果把方点的权值记为双联通分量的大小,圆点权值记为-1,那么\(x \rightarrow y\)的答案就是树上\(x\rightarrow y\)的路径权值和. 直接枚举\(O(n^2)\),点分治\(O(n\log n)\),考虑每个点被经过的次数乘上它的权值即可\(O(n)\). 注意图可能不连通. 代码 #include<b…
题目链接 LOJ 洛谷P4630 先对这张图建圆方树. 对于S->T这条(些)路径,其对答案的贡献为可能经过的所有点数,那么我们把方点权值设为联通分量的大小,可以直接去求树上路径权值和. 因为两方点之间的圆点会计算两次,所以圆点权值设为-1就好了. 那么现在有 \(n^2\) 个点对,求每个点对之间的路径上点的权值和. 对每个点计算一下被计算次数就可以了.这个路径次数计算注意考虑全.. 另外点对是圆点间的,所以方点初始sz[]为0,圆点的sz[]才是1. 方点其实建一条边就可以. LOJ为什么找…
过了14个月再重新看这题,发现圆方树从来就没有写过.然后写了这题发现自己APIO2018打铁的原因竟然是没开long long,将树的部分的O(n)写挂了(爆int),毕竟去年APIO时我啥都不会,连tarjan都写不来,活该打铁. 不扯了写题解. 首先建立圆方树,然后任意枚举圆点s和f,然后c可以在这两个点路径中每个点双的点挑选.所以令圆点值为-1,方点值为点双大小,然后选法是圆点路径权值和.然后计算每个点出现多少次,可以对每个连通块树形DP求解,然后这道题就没了. #include<bits…
传送门 题意简述:给你一张无向图,问你满足存在从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…
[APIO2018]铁人两项(圆方树,动态规划) 题面 UOJ 洛谷 BZOJ 题解 嘤嘤嘤,APIO的时候把一个组合数写成阶乘了,然后这题的70多分没拿到 首先一棵树是很容易做的,随意指定起点终点就只能在两点路径上选择第三点.那么考虑过中点的路径个数,就可以很方便的\(dp\)计算了. 对于仙人掌而言,把环全部缩成点,转成树,缩起来的点额外定义一个点权,同样可以直接在树上做\(dp\),额外考虑环自身内部的贡献. 那么对于一般图而言,构建圆方树,那么选定起点和终点后,还是只能选择两点路径之间的…
题目链接 洛谷P4630 题解 看了一下部分分,觉得树的部分很可做,就相当于求一个点对路径长之和的东西,考虑一下能不能转化到一般图来? 一般图要转为树,就使用圆方树呗 思考一下发现,两点之间经过的点双,点双内所有点一定都可以作为中介点 那么我们将方点赋值为点双大小,为了去重,剩余点赋值\(-1\) 答案就是任意两点间权值和之和 我们只需枚举每个点被经过多少次,这就很容易计算了 复杂度\(O(n)\) #include<algorithm> #include<iostream> #i…
圆方树大致理解:将每个点双看做一个新建的点(方点),该点双内的所有点(圆点)都向新建的点连边,最后形成一棵树,可以给点赋予点权,用以解决相关路径问题. 在本题中,方点点权赋值为该点双的大小,因为两个点双最多有一个交点,将圆点赋为-1来去重,先用tarjan()构建出圆方树,在跑一遍dfs,dfs枚举的是作为c的点,维护sz2[ ](圆点个数,因为s和f只能是圆点),利用乘法原理累加答案即可. 注意代码中累加答案是要乘2,(s和f可以交换). 1 #include<bits/stdc++.h>…
\(\mathcal{Description}\)   Link.   给定一个 \(n\) 个点 \(m\) 条边的无向图(不保证联通),求有序三元点对 \((s,c,f)\) 的个数,满足 \(s,c,f\) 互不相同,且存在一条从 \(s\) 到 \(c\) 再到 \(f\) 的简单路径.   \(n\le10^5\),\(m\le2\times10^5\). \(\mathcal{Solution}\)   首先考虑这样一个问题,若 \(s,c,f\) 在同一点双中,是否一定满足条件.…
QWQ神仙题啊(据说是今年第一次出现圆方树的地方) 首先根据题目,我们就是求对于每一个路径\((s,t)\)他的贡献就是两个点之间的点数,但是图上问题我并没有办法很好的解决... 这时候考虑圆方树,我们将圆方树建出来之后, 我们令方点的权值是他所连接的圆点之和,圆点的权值是\(-1\). 这里之所以让圆点的贡献是-1,是为了方便表示路径的贡献(不然貌似比较复杂). 如果我们这么赋值的话,那么一个条路经的贡献就应该是点权之和. QWQ可惜枚举两个端点是\(O(n^2)\)复杂度的 那么这时候,我们…
题目链接 题意大概是,求有多少三元组$(s,c,f)(s \neq c, c \neq f, s \neq f)$,满足从$s$到$f$有一条简单路径经过$c$. 得到结论: 点双中任意互不相同的三个点,必定存在一条简单路径依次经过这三个点. 显然,割点只能经过一次. 建出一棵圆方树,圆点的权值为$-1$,方点的权值为该点双中点的个数,那任意两个圆点之间可以作为它们中转点的个数就是它们在圆方树上路径的点权和. 具体来讲就是割点上只能经过一次,圆点设成$-1$是为了去重方便. 以前只写过点双缩树,…